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:
authorTon Roosendaal <ton@blender.org>2004-12-27 22:28:52 +0300
committerTon Roosendaal <ton@blender.org>2004-12-27 22:28:52 +0300
commit610cec55c7134c3dada168530ee833276677bae7 (patch)
tree428e061d0d42b79b9332688951baa3f189a3a985
parentc43c38140d59e9204d55a62c87e0b701f50f2538 (diff)
Biiig commit! Thanks to 2-3 weeks of cvs freeze...
Render: - New; support for dual CPU render (SDL thread) Currently only works with alternating scanlines, but gives excellent performance. For both normal render as unified implemented. Note the "mutex" locks on z-transp buffer render and imbuf loads. - This has been made possible by major cleanups in render code, especially getting rid of globals (example Tin Tr Tg Tb Ta for textures) or struct OSA or using Materials or Texture data to write to. - Made normal render fully 4x32 floats too, and removed all old optimizes with chars or shorts. - Made normal render and unified render use same code for sky and halo render, giving equal (and better) results for halo render. Old render now also uses PostProcess options (brightness, mul, gamma) - Added option ("FBuf") in F10 Output Panel, this keeps a 4x32 bits buffer after render. Using PostProcess menu you will note an immediate re- display of image too (32 bits RGBA) - Added "Hue" and "Saturation" sliders to PostProcess options - Render module is still not having a "nice" API, but amount of dependencies went down a lot. Next todo: remove abusive "previewrender" code. The last main global in Render (struct Render) now can be re-used for fully controlling a render, to allow multiple "instances" of render to open. - Renderwindow now displays a smal bar on top with the stats, and keeps the stats after render too. Including "spare" page support. Not only easier visible that way, but also to remove the awkward code that was drawing stats in the Info header (extreme slow on some ATIs too) - Cleaned up blendef.h and BKE_utildefines.h, these two had overlapping defines. - I might have forgotten stuff... and will write a nice doc on the architecture!
-rw-r--r--COPYING4
-rw-r--r--SConstruct1
-rw-r--r--release/Makefile1
-rw-r--r--release/plugins/bmake2
-rw-r--r--source/blender/blenkernel/BKE_bad_level_calls.h4
-rw-r--r--source/blender/blenkernel/BKE_curve.h3
-rw-r--r--source/blender/blenkernel/BKE_displist.h24
-rw-r--r--source/blender/blenkernel/BKE_global.h2
-rw-r--r--source/blender/blenkernel/BKE_image.h10
-rw-r--r--source/blender/blenkernel/BKE_osa_types.h55
-rw-r--r--source/blender/blenkernel/BKE_packedFile.h3
-rw-r--r--source/blender/blenkernel/BKE_scene.h15
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h197
-rw-r--r--source/blender/blenkernel/bad_level_call_stubs/stubs.c5
-rw-r--r--source/blender/blenkernel/intern/blender.c5
-rw-r--r--source/blender/blenkernel/intern/displist.c87
-rw-r--r--source/blender/blenkernel/intern/effect.c40
-rw-r--r--source/blender/blenkernel/intern/exotic.c2
-rw-r--r--source/blender/blenkernel/intern/image.c1207
-rw-r--r--source/blender/blenkernel/intern/material.c23
-rw-r--r--source/blender/blenkernel/intern/scene.c9
-rw-r--r--source/blender/blenkernel/intern/texture.c6
-rw-r--r--source/blender/blenlib/BLI_arithb.h4
-rw-r--r--source/blender/blenlib/intern/arithb.c35
-rw-r--r--source/blender/blenloader/intern/readfile.c34
-rw-r--r--source/blender/blenloader/intern/writefile.c14
-rw-r--r--source/blender/include/BIF_meshtools.h1
-rw-r--r--source/blender/include/BIF_renderwin.h1
-rw-r--r--source/blender/include/BSE_sequence.h1
-rw-r--r--source/blender/include/blendef.h107
-rw-r--r--source/blender/include/butspace.h1
-rw-r--r--source/blender/makesdna/DNA_material_types.h1
-rw-r--r--source/blender/makesdna/DNA_scene_types.h11
-rw-r--r--source/blender/makesdna/DNA_texture_types.h2
-rw-r--r--source/blender/python/api2_2x/sceneRender.c29
-rw-r--r--source/blender/render/SConscript5
-rw-r--r--source/blender/render/extern/include/render.h43
-rw-r--r--source/blender/render/extern/include/render_types.h64
-rw-r--r--source/blender/render/intern/include/envmap.h5
-rw-r--r--source/blender/render/intern/include/gammaCorrectionTables.h7
-rw-r--r--source/blender/render/intern/include/initrender.h9
-rw-r--r--source/blender/render/intern/include/jitter.h3
-rw-r--r--source/blender/render/intern/include/old_zbuffer_types.h57
-rw-r--r--source/blender/render/intern/include/pixelblending.h13
-rw-r--r--source/blender/render/intern/include/pixelblending_types.h59
-rw-r--r--source/blender/render/intern/include/pixelshading.h14
-rw-r--r--source/blender/render/intern/include/render_intern.h62
-rw-r--r--source/blender/render/intern/include/rendercore.h78
-rw-r--r--source/blender/render/intern/include/rendercore_int.h52
-rw-r--r--source/blender/render/intern/include/shadbuf.h2
-rw-r--r--source/blender/render/intern/include/texture.h20
-rw-r--r--source/blender/render/intern/include/vanillaRenderPipe.h10
-rw-r--r--source/blender/render/intern/include/vanillaRenderPipe_int.h192
-rw-r--r--source/blender/render/intern/include/zbuf.h6
-rw-r--r--source/blender/render/intern/include/zbuf_int.h197
-rw-r--r--source/blender/render/intern/source/Makefile1
-rw-r--r--source/blender/render/intern/source/RE_callbacks.c1
-rw-r--r--source/blender/render/intern/source/edgeRender.c46
-rw-r--r--source/blender/render/intern/source/envmap.c99
-rw-r--r--source/blender/render/intern/source/errorHandler.c2
-rw-r--r--source/blender/render/intern/source/gammaCorrectionTables.c17
-rw-r--r--source/blender/render/intern/source/imagetexture.c911
-rw-r--r--source/blender/render/intern/source/initrender.c554
-rw-r--r--source/blender/render/intern/source/jitter.c4
-rw-r--r--source/blender/render/intern/source/pixelblending.c99
-rw-r--r--source/blender/render/intern/source/pixelshading.c365
-rw-r--r--source/blender/render/intern/source/ray.c405
-rw-r--r--source/blender/render/intern/source/renderHelp.c6
-rw-r--r--source/blender/render/intern/source/renderPreAndPost.c6
-rw-r--r--source/blender/render/intern/source/rendercore.c1872
-rw-r--r--source/blender/render/intern/source/renderdatabase.c47
-rw-r--r--source/blender/render/intern/source/shadbuf.c81
-rw-r--r--source/blender/render/intern/source/texture.c972
-rw-r--r--source/blender/render/intern/source/vanillaRenderPipe.c1550
-rw-r--r--source/blender/render/intern/source/zbuf.c743
-rw-r--r--source/blender/render/intern/source/zbufferdatastruct.c6
-rw-r--r--source/blender/renderconverter/RE_renderconverter.h7
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c145
-rw-r--r--source/blender/src/buttons_editing.c7
-rw-r--r--source/blender/src/buttons_scene.c79
-rw-r--r--source/blender/src/drawimage.c2
-rw-r--r--source/blender/src/drawmesh.c3
-rw-r--r--source/blender/src/drawobject.c2
-rw-r--r--source/blender/src/drawseq.c3
-rw-r--r--source/blender/src/drawview.c268
-rw-r--r--source/blender/src/editaction.c9
-rw-r--r--source/blender/src/editface.c2
-rw-r--r--source/blender/src/editipo.c22
-rw-r--r--source/blender/src/editlattice.c3
-rw-r--r--source/blender/src/editmball.c2
-rw-r--r--source/blender/src/editmesh.c1
-rw-r--r--source/blender/src/editmesh_mods.c10
-rw-r--r--source/blender/src/editobject.c4
-rw-r--r--source/blender/src/editoops.c1
-rw-r--r--source/blender/src/editscreen.c2
-rw-r--r--source/blender/src/editseq.c1
-rw-r--r--source/blender/src/editsima.c1
-rw-r--r--source/blender/src/filesel.c2
-rw-r--r--source/blender/src/header_action.c1
-rw-r--r--source/blender/src/header_image.c1
-rw-r--r--source/blender/src/header_info.c4
-rw-r--r--source/blender/src/header_nla.c7
-rw-r--r--source/blender/src/headerbuttons.c1
-rw-r--r--source/blender/src/meshtools.c72
-rw-r--r--source/blender/src/previewrender.c133
-rw-r--r--source/blender/src/renderwin.c217
-rw-r--r--source/blender/src/resources.c2
-rw-r--r--source/blender/src/screendump.c2
-rw-r--r--source/blender/src/seqaudio.c2
-rw-r--r--source/blender/src/sequence.c9
-rw-r--r--source/blender/src/toets.c4
-rw-r--r--source/blender/src/toolbox.c2
-rw-r--r--source/blender/src/usiblender.c3
-rw-r--r--source/blender/src/view.c2
-rw-r--r--source/blender/src/writeavicodec.c2
-rw-r--r--source/blender/src/writeimage.c2
-rwxr-xr-xsource/blender/yafray/intern/export_File.cpp2
-rw-r--r--source/blender/yafray/intern/export_Plugin.cpp2
-rw-r--r--source/creator/creator.c4
119 files changed, 5061 insertions, 6620 deletions
diff --git a/COPYING b/COPYING
index f7d3a5add07..232ee776d87 100644
--- a/COPYING
+++ b/COPYING
@@ -1,3 +1,3 @@
Please read over both of the following files:
-intern/GPL-license.txt
-intern/BL-license.txt
+doc/GPL-license.txt
+doc/BL-license.txt
diff --git a/SConstruct b/SConstruct
index 0b55b67ebfa..f5b01816f7c 100644
--- a/SConstruct
+++ b/SConstruct
@@ -1016,6 +1016,7 @@ if bs_globals.enable_clean==0: # only read SConscripts when not cleaning, this t
Export ('extra_includes')
Export ('user_options_dict')
Export ('library_env')
+ Export ('sdl_env')
BuildDir (bs_globals.root_build_dir+'/extern', 'extern', duplicate=0)
SConscript (bs_globals.root_build_dir+'extern/SConscript')
diff --git a/release/Makefile b/release/Makefile
index 65e84c30a97..767518ffad0 100644
--- a/release/Makefile
+++ b/release/Makefile
@@ -145,6 +145,7 @@ endif
ifeq ($(OS),darwin)
@echo "----> Move .blender to .app/Contents/MacOS/"
+ @rm -fr $(DISTDIR)/blender$(EXT0)/Contents/MacOS/.blender
@mv $(DISTDIR)/.blender $(DISTDIR)/blender$(EXT0)/Contents/MacOS/
endif
diff --git a/release/plugins/bmake b/release/plugins/bmake
index 50f274ef395..6e65f0bcbc8 100644
--- a/release/plugins/bmake
+++ b/release/plugins/bmake
@@ -74,7 +74,7 @@ elif ( test $UNAME = "Darwin" ) then
CC="cc";
CFLAGS="-fPIC -funsigned-char -O2 -fno-common";
LD="cc";
- LDFLAGS="-flat_namespace -bundle -bundle_loader ../../blender.app/Contents/MacOS/blender -ldl -lm";
+ LDFLAGS="-flat_namespace -bundle -bundle_loader ../../blender.app/Contents/MacOS/blender -lm";
EXT="so";
fi
diff --git a/source/blender/blenkernel/BKE_bad_level_calls.h b/source/blender/blenkernel/BKE_bad_level_calls.h
index 8a875916a26..709e9f87cbb 100644
--- a/source/blender/blenkernel/BKE_bad_level_calls.h
+++ b/source/blender/blenkernel/BKE_bad_level_calls.h
@@ -133,12 +133,8 @@ void RE_free_envmap(struct EnvMap *env);
struct EnvMap *RE_copy_envmap(struct EnvMap *env);
void RE_free_envmapdata(struct EnvMap *env);
int RE_envmaptex(struct Tex *tex, float *texvec, float *dxt, float *dyt);
-void RE_calc_R_ref(void);
extern char texstr[20][12]; /* buttons.c */
-/* memory for O is declared in the render module... */
-#include "BKE_osa_types.h"
-extern Osa O;
/* editsca.c */
void make_unique_prop_names(char *str);
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index d0a9c1e5c6a..7b76a438e59 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -42,6 +42,9 @@ struct ListBase;
struct BezTriple;
struct BevList;
+#define KNOTSU(nu) ( (nu)->orderu+ (nu)->pntsu+ (nu->orderu-1)*((nu)->flagu & 1) )
+#define KNOTSV(nu) ( (nu)->orderv+ (nu)->pntsv+ (nu->orderv-1)*((nu)->flagv & 1) )
+
int copyintoExtendedArray(float *old, int oldx, int oldy, float *newp, int newx, int newy);
void unlink_curve( struct Curve *cu);
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 34cb2c64ec6..95883501f55 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -53,6 +53,30 @@
#define DL_FRONT_CURVE 4
#define DL_BACK_CURVE 8
+/* This should, of course, become a function */
+#define DL_SURFINDEX(cyclu, cyclv, sizeu, sizev) \
+\
+if( (cyclv)==0 && a==(sizev)-1) break; \
+if(cyclu) { \
+ p1= sizeu*a; \
+ p2= p1+ sizeu-1; \
+ p3= p1+ sizeu; \
+ p4= p2+ sizeu; \
+ b= 0; \
+} \
+else { \
+ p2= sizeu*a; \
+ p1= p2+1; \
+ p4= p2+ sizeu; \
+ p3= p1+ sizeu; \
+ b= 1; \
+} \
+if( (cyclv) && a==sizev-1) { \
+ p3-= sizeu*sizev; \
+ p4-= sizeu*sizev; \
+}
+
+
/* prototypes */
struct Object;
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 0196d8bc391..cf642932447 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -93,6 +93,8 @@ typedef struct Global {
short machine, afbreek, moving, colact, zbuf;
short qual, background, imagewin, animspeed;
+ short winpos, displaymode; /* used to be in Render */
+
/**
* The current version of Blender.
*/
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index fd278aa5329..2da0dcb5f5a 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -47,18 +47,12 @@ void free_image(struct Image *me);
void free_image_buffers(struct Image *ima);
struct Image *add_image(char *name);
void free_unused_animimages(void);
+
void makepicstring(char *string, int frame);
struct anim *openanim(char * name, int flags);
-int calcimanr(int cfra, struct Tex *tex);
-void do_laseroptics_patch(struct ImBuf *ibuf);
-void de_interlace_ng(struct ImBuf *ibuf);
-void de_interlace_st(struct ImBuf *ibuf);
-void load_image(struct Image * ima, int flags, char *relabase, int framenum);
void ima_ibuf_is_nul(struct Tex *tex);
-int imagewrap(struct Tex *tex, float *texvec);
-int imagewraposa(struct Tex *tex, float *texvec, float *dxt, float *dyt);
+void load_image(struct Image * ima, int flags, char *relabase, int framenum);
void converttopremul(struct ImBuf *ibuf);
-void makemipmap(struct Image *ima);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/BKE_osa_types.h b/source/blender/blenkernel/BKE_osa_types.h
deleted file mode 100644
index 28d4147c11b..00000000000
--- a/source/blender/blenkernel/BKE_osa_types.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * blenlib/BKE_osa_types.h (mar-2001 nzc)
- *
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * 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.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-#ifndef BKE_OSA_TYPES_H
-#define BKE_OSA_TYPES_H
-
-/* typedef struct Osa */
-typedef struct RE_Osa
-{
- float dxco[3], dyco[3];
- float dxlo[3], dylo[3], dxgl[3], dygl[3], dxuv[3], dyuv[3];
- float dxref[3], dyref[3], dxorn[3], dyorn[3];
- float dxno[3], dyno[3], dxview, dyview;
- float dxlv[3], dylv[3];
- float dxwin[3], dywin[3];
- float dxsticky[3], dysticky[3];
- float dxrefract[3], dyrefract[3];
-} Osa;
-
-/* extern Osa O; */
-/* This one used to be done in render/extern/include/render.h, because
- memory was allocated in that module. (nzc)*/
-
-#endif
-
diff --git a/source/blender/blenkernel/BKE_packedFile.h b/source/blender/blenkernel/BKE_packedFile.h
index bb605ba55a0..270a0492f91 100644
--- a/source/blender/blenkernel/BKE_packedFile.h
+++ b/source/blender/blenkernel/BKE_packedFile.h
@@ -34,6 +34,9 @@
#ifndef BKE_PACKEDFILE_H
#define BKE_PACKEDFILE_H
+#define RET_OK 0
+#define RET_ERROR 1
+
struct PackedFile;
struct VFont;
struct bSample;
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 9d1a23952ad..538912a1f40 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -40,6 +40,21 @@ struct Base;
struct AviCodecData;
struct QuicktimeCodecData;
+/* sequence related defines */
+#define WHILE_SEQ(base) { \
+ int totseq_, seq_; Sequence **seqar; \
+ build_seqar( base, &seqar, &totseq_); \
+ for(seq_ = 0; seq_ < totseq_; seq_++) { \
+ seq= seqar[seq_];
+
+
+#define END_SEQ } \
+ if(seqar) MEM_freeN(seqar); \
+}
+
+
+
+
void free_avicodecdata(struct AviCodecData *acd);
void free_qtcodecdata(struct QuicktimeCodecData *acd);
void free_scene(struct Scene *me);
diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h
index c32e767ab92..b1f084fd566 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -44,6 +44,12 @@
#define TRUE 1
#endif
+/* also fill in structs itself, dna cannot handle defines, duplicate in blendef.h still */
+#ifndef FILE_MAXDIR
+#define FILE_MAXDIR 160
+#define FILE_MAXFILE 80
+#endif
+
#define ELEM(a, b, c) ( (a)==(b) || (a)==(c) )
#define ELEM3(a, b, c, d) ( ELEM(a, b, c) || (a)==(d) )
#define ELEM4(a, b, c, d, e) ( ELEM(a, b, c) || ELEM(a, d, e) )
@@ -67,18 +73,6 @@
#define MAX3(x,y,z) MAX2( MAX2((x),(y)) , (z) )
#define MAX4(x,y,z,a) MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
-#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
-
-#define ABS(a) ( (a)<0 ? (-(a)) : (a) )
-
-#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
-#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
-
-#define VECADD(v1,v2,v3) {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
-#define VECSUB(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
-
-#define INPR(v1, v2) ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
-
#define INIT_MINMAX(min, max) (min)[0]= (min)[1]= (min)[2]= 1.0e30; (max)[0]= (max)[1]= (max)[2]= -1.0e30;
#define INIT_MINMAX2(min, max) (min)[0]= (min)[1]= 1.0e30; (max)[0]= (max)[1]= -1.0e30;
@@ -95,17 +89,32 @@
if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1];
-/* interferes elsewhere */
-/* also fill in structs itself, dna cannot handle defines */
-#define FILE_MAXDIR 160
-#define FILE_MAXFILE 80
+#define MINSIZE(val, size) ( ((val)>=0.0) ? (((val)<(size)) ? (size): (val)) : ( ((val)>(-size)) ? (-size) : (val)))
+
+/* some math and copy defines */
+
+#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
+
+#define ABS(a) ( (a)<0 ? (-(a)) : (a) )
+
+#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
+#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
+#define LONGCOPY(a, b, c) {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
+
+
+#define VECADD(v1,v2,v3) {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
+#define VECSUB(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
+
+#define INPR(v1, v2) ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
/* some misc stuff.... */
#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
+#define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
+#define CLAMPTEST(a, b, c) if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
+
+#define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
-#define KNOTSU(nu) ( (nu)->orderu+ (nu)->pntsu+ (nu->orderu-1)*((nu)->flagu & 1) )
-#define KNOTSV(nu) ( (nu)->orderv+ (nu)->pntsv+ (nu->orderv-1)*((nu)->flagv & 1) )
/* this weirdo pops up in two places ... */
#if !defined(WIN32) && !defined(__BeOS)
@@ -146,28 +155,6 @@
#define ENDB MAKE_ID('E','N','D','B')
-/* This should, of course, become a function */
-#define DL_SURFINDEX(cyclu, cyclv, sizeu, sizev) \
- \
- if( (cyclv)==0 && a==(sizev)-1) break; \
- if(cyclu) { \
- p1= sizeu*a; \
- p2= p1+ sizeu-1; \
- p3= p1+ sizeu; \
- p4= p2+ sizeu; \
- b= 0; \
- } \
- else { \
- p2= sizeu*a; \
- p1= p2+1; \
- p4= p2+ sizeu; \
- p3= p1+ sizeu; \
- b= 1; \
- } \
- if( (cyclv) && a==sizev-1) { \
- p3-= sizeu*sizev; \
- p4-= sizeu*sizev; \
- }
/* This one rotates the bytes in an int */
#define SWITCH_INT(a) { \
@@ -176,131 +163,19 @@
s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
-/* More brain damage. Only really used by packedFile.c */
-// return values
-#define RET_OK 0
-#define RET_ERROR 1
-/* and these aren't used at all */
-/* #define RET_CANCEL 2 */
-/* #define RET_YES (1 == 1) */
-/* #define RET_NO (1 == 0) */
-
-/* sequence related defines */
-#define WHILE_SEQ(base) { \
- int totseq_, seq_; Sequence **seqar; \
- build_seqar( base, &seqar, &totseq_); \
- for(seq_ = 0; seq_ < totseq_; seq_++) { \
- seq= seqar[seq_];
-
-
-#define END_SEQ } \
- if(seqar) MEM_freeN(seqar); \
- }
-
-
-/* not really sure about these... some kind of event codes ?*/
-/* INFO: 300 */
-/* pas op: ook in filesel.c en editobject.c */
-#define B_INFOSCR 301
-#define B_INFODELSCR 302
-#define B_INFOSCE 304
-#define B_INFODELSCE 305
-#define B_FILEMENU 306
-#define B_PACKFILE 307
-
-/* From iff.h, but seemingly detached from anything else... To which
- * encoding scheme do they belong? */
-#define AMI (1 << 31)
-#define CDI (1 << 30)
-#define Anim (1 << 29)
-#define TGA (1 << 28)
-#define JPG (1 << 27)
-#define TIM (1 << 26)
-
-#define TIM_CLUT (010)
-#define TIM_4 (TIM | TIM_CLUT | 0)
-#define TIM_8 (TIM | TIM_CLUT | 1)
-#define TIM_16 (TIM | 2)
-#define TIM_24 (TIM | 3)
-
-#define RAWTGA (TGA | 1)
-
-#define JPG_STD (JPG | (0 << 8))
-#define JPG_VID (JPG | (1 << 8))
-#define JPG_JST (JPG | (2 << 8))
-#define JPG_MAX (JPG | (3 << 8))
-#define JPG_MSK (0xffffff00)
-
-#define AM_ham (0x0800 | AMI)
-#define AM_hbrite (0x0080 | AMI)
-#define AM_lace (0x0004 | AMI)
-#define AM_hires (0x8000 | AMI)
-#define AM_hblace (AM_hbrite | AM_lace)
-#define AM_hilace (AM_hires | AM_lace)
-#define AM_hamlace (AM_ham | AM_lace)
-
-#define RGB888 1
-#define RGB555 2
-#define DYUV 3
-#define CLUT8 4
-#define CLUT7 5
-#define CLUT4 6
-#define CLUT3 7
-#define RL7 8
-#define RL3 9
-#define MPLTE 10
-
-#define DYUV1 0
-#define DYUVE 1
-
-#define CD_rgb8 (RGB888 | CDI)
-#define CD_rgb5 (RGB555 | CDI)
-#define CD_dyuv (DYUV | CDI)
-#define CD_clut8 (CLUT8 | CDI)
-#define CD_clut7 (CLUT7 | CDI)
-#define CD_clut4 (CLUT4 | CDI)
-#define CD_clut3 (CLUT3 | CDI)
-#define CD_rl7 (RL7 | CDI)
-#define CD_rl3 (RL3 | CDI)
-#define CD_mplte (MPLTE | CDI)
-
-#define C233 1
-#define YUVX 2
-#define HAMX 3
-#define TANX 4
-
-#define AN_c233 (Anim | C233)
-#define AN_yuvx (Anim | YUVX)
-#define AN_hamx (Anim | HAMX)
-#define AN_tanx (Anim | TANX)
-
-#define IMAGIC 0732
-
-/* This used to reside in render.h. It does some texturing. */
-#define BRICON Tin= (Tin-0.5)*tex->contrast+tex->bright-0.5; \
- if(Tin<0.0) Tin= 0.0; else if(Tin>1.0) Tin= 1.0;
-
-#define BRICONRGB Tr= tex->rfac*((Tr-0.5)*tex->contrast+tex->bright-0.5); \
- if(Tr<0.0) Tr= 0.0; \
- Tg= tex->gfac*((Tg-0.5)*tex->contrast+tex->bright-0.5); \
- if(Tg<0.0) Tg= 0.0; \
- Tb= tex->bfac*((Tb-0.5)*tex->contrast+tex->bright-0.5); \
- if(Tb<0.0) Tb= 0.0;
-
-/* mystifying stuff from blendef... */
-#define SELECT 1
-#define ACTIVE 2
-#define NOT_YET 0
-
-/* ???? */
+
+/* Bit operations */
#define BTST(a,b) ( ( (a) & 1<<(b) )!=0 )
#define BSET(a,b) ( (a) | 1<<(b) )
+#define BCLR(a,b) ( (a) & ~(1<<(b)) )
+/* bit-row */
+#define BROW(min, max) (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
-/* needed for material.c*/
-#define REDRAWBUTSMAT 0x4015
-/* useless game shit */
-#define MA_FH_NOR 2
+#ifdef GS
+#undef GS
+#endif
+#define GS(a) (*((short *)(a)))
#endif
diff --git a/source/blender/blenkernel/bad_level_call_stubs/stubs.c b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
index 13218846b59..4da7d2a2f20 100644
--- a/source/blender/blenkernel/bad_level_call_stubs/stubs.c
+++ b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
@@ -195,10 +195,9 @@ int BPY_call_importloader(char *name)
#define INT 96
/* struct EnvMap; */
/* struct Tex; */
-float Ta, Tb, Tg, Tin, Tr;
void do_material_tex(ShadeInput *shi){}
-void externtex(struct MTex *mtex, float *vec){}
+void externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta){}
void init_render_textures(void){}
void end_render_textures(void){}
@@ -210,9 +209,7 @@ int RE_envmaptex(struct Tex *tex, float *texvec, float *dxt, float *dyt){
return 0;
}
-void RE_calc_R_ref(void){}
char texstr[20][12]; /* buttons.c */
-Osa O;
/* editsca.c */
void make_unique_prop_names(char *str) {}
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 69363f4d9af..db8653f0abe 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -91,6 +91,7 @@
#include "BIF_mainqueue.h" // mainqenter for onload script
#include "mydevice.h"
#include "nla.h"
+#include "blendef.h"
Global G;
UserDef U;
@@ -318,8 +319,8 @@ static void setup_app_data(BlendFileData *bfd, char *filename)
G.scene= curscene;
}
else {
- R.winpos= bfd->winpos;
- R.displaymode= bfd->displaymode;
+ G.winpos= bfd->winpos;
+ G.displaymode= bfd->displaymode;
G.fileflags= bfd->fileflags;
G.curscreen= bfd->curscreen;
G.scene= G.curscreen->scene;
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 922b4d5cf78..228588e2c4a 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -521,18 +521,24 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
int a, back;
if(ma==0) return;
+
shi.mat= ma;
- shi.matren= ma->ren;
shi.vlr= NULL; // have to do this!
- ma= shi.matren;
+
+ // copy all relevant material vars, note, keep this synced with render_types.h
+ memcpy(&shi.r, &shi.mat->r, 23*sizeof(float));
+ // set special cases:
+ shi.har= shi.mat->har;
+
shi.osatex= 0; // also prevents reading vlr
+
VECCOPY(shi.vn, nor);
if(ma->mode & MA_VERTEXCOLP) {
if(vertcol) {
- ma->r= vertcol[3]/255.0;
- ma->g= vertcol[2]/255.0;
- ma->b= vertcol[1]/255.0;
+ shi.r= vertcol[3]/255.0;
+ shi.g= vertcol[2]/255.0;
+ shi.b= vertcol[1]/255.0;
}
}
@@ -565,24 +571,19 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
shi.ref[2]= (-1.0+inp*shi.vn[2]);
}
- if(ma->mode & MA_VERTEXCOLP) {
- shi.mat->r= ma->r;
- shi.mat->g= ma->g;
- shi.mat->b= ma->b;
- }
do_material_tex(&shi);
}
if(ma->mode & MA_SHLESS) {
if(vertcol && (ma->mode & (MA_VERTEXCOL+MA_VERTEXCOLP))== MA_VERTEXCOL ) {
- col1[3]= vertcol[3]*ma->r;
- col1[2]= vertcol[2]*ma->g;
- col1[1]= vertcol[1]*ma->b;
+ col1[3]= vertcol[3]*shi.r;
+ col1[2]= vertcol[2]*shi.g;
+ col1[1]= vertcol[1]*shi.b;
}
else {
- col1[3]= (255.0*ma->r);
- col1[2]= (255.0*ma->g);
- col1[1]= (255.0*ma->b);
+ col1[3]= (255.0*shi.r);
+ col1[2]= (255.0*shi.g);
+ col1[1]= (255.0*shi.b);
}
if(col2) {
col2[3]= col1[3];
@@ -593,14 +594,14 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
}
if( vertcol && (ma->mode & (MA_VERTEXCOL+MA_VERTEXCOLP))== MA_VERTEXCOL ) {
- diff1[0]= diff2[0]= ma->r*(ma->emit+vertcol[3]/255.0);
- diff1[1]= diff2[1]= ma->g*(ma->emit+vertcol[2]/255.0);
- diff1[2]= diff2[2]= ma->b*(ma->emit+vertcol[1]/255.0);
+ diff1[0]= diff2[0]= shi.r*(shi.emit+vertcol[3]/255.0);
+ diff1[1]= diff2[1]= shi.g*(shi.emit+vertcol[2]/255.0);
+ diff1[2]= diff2[2]= shi.b*(shi.emit+vertcol[1]/255.0);
}
else {
- diff1[0]= diff2[0]= ma->r*ma->emit;
- diff1[1]= diff2[1]= ma->g*ma->emit;
- diff1[2]= diff2[2]= ma->b*ma->emit;
+ diff1[0]= diff2[0]= shi.r*shi.emit;
+ diff1[1]= diff2[1]= shi.g*shi.emit;
+ diff1[2]= diff2[2]= shi.b*shi.emit;
}
shi.view[0]= 0.0;
@@ -679,7 +680,7 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
back= 1;
is= -is;
}
- inp= is*lampdist*ma->ref;
+ inp= is*lampdist*shi.refl;
if(back==0) {
add_to_diffuse(diff1, &shi, is, inp*fl->r, inp*fl->g, inp*fl->b);
@@ -692,20 +693,20 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
//diff2[1]+= inp*fl->g;
//diff2[2]+= inp*fl->b;
}
- if(ma->spec && (fl->mode & LA_NO_SPEC)==0) {
+ if(shi.spec!=0.0 && (fl->mode & LA_NO_SPEC)==0) {
float specfac;
if(ma->spec_shader==MA_SPEC_PHONG)
- specfac= Phong_Spec(nor, lv, shi.view, ma->har);
+ specfac= Phong_Spec(nor, lv, shi.view, shi.har);
else if(ma->spec_shader==MA_SPEC_COOKTORR)
- specfac= CookTorr_Spec(nor, lv, shi.view, ma->har);
+ specfac= CookTorr_Spec(nor, lv, shi.view, shi.har);
else if(ma->spec_shader==MA_SPEC_BLINN)
- specfac= Blinn_Spec(nor, lv, shi.view, ma->refrac, (float)ma->har);
+ specfac= Blinn_Spec(nor, lv, shi.view, ma->refrac, (float)shi.har);
else
specfac= Toon_Spec(nor, lv, shi.view, ma->param[2], ma->param[3]);
if(specfac>0) {
- t= specfac*ma->spec*lampdist;
+ t= specfac*shi.spec*lampdist;
if(back==0) {
if(ma->mode & MA_RAMP_SPEC) {
float spec[3];
@@ -715,9 +716,9 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
isb+= t*(fl->b * spec[2]);
}
else {
- isr+= t*(fl->r * ma->specr);
- isg+= t*(fl->g * ma->specg);
- isb+= t*(fl->b * ma->specb);
+ isr+= t*(fl->r * shi.specr);
+ isg+= t*(fl->g * shi.specg);
+ isb+= t*(fl->b * shi.specb);
}
}
else if(col2) {
@@ -729,9 +730,9 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
isb1+= t*(fl->b * spec[2]);
}
else {
- isr1+= t*(fl->r * ma->specr);
- isg1+= t*(fl->g * ma->specg);
- isb1+= t*(fl->b * ma->specb);
+ isr1+= t*(fl->r * shi.specr);
+ isg1+= t*(fl->g * shi.specg);
+ isb1+= t*(fl->b * shi.specb);
}
}
}
@@ -742,13 +743,13 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
if(ma->mode & MA_RAMP_COL) ramp_diffuse_result(diff1, &shi);
if(ma->mode & MA_RAMP_SPEC) ramp_spec_result(&isr, &isg, &isb, &shi);
- a= 256*(diff1[0] + ma->ambr +isr);
+ a= 256*(diff1[0] + shi.ambr +isr);
if(a>255) col1[3]= 255;
else col1[3]= a;
- a= 256*(diff1[1] + ma->ambg +isg);
+ a= 256*(diff1[1] + shi.ambg +isg);
if(a>255) col1[2]= 255;
else col1[2]= a;
- a= 256*(diff1[2] + ma->ambb +isb);
+ a= 256*(diff1[2] + shi.ambb +isb);
if(a>255) col1[1]= 255;
else col1[1]= a;
@@ -756,13 +757,13 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
if(ma->mode & MA_RAMP_COL) ramp_diffuse_result(diff2, &shi);
if(ma->mode & MA_RAMP_SPEC) ramp_spec_result(&isr1, &isg1, &isb1, &shi);
- a= 256*(diff2[0] + ma->ambr +isr1);
+ a= 256*(diff2[0] + shi.ambr +isr1);
if(a>255) col2[3]= 255;
else col2[3]= a;
- a= 256*(diff2[1] + ma->ambg +isg1);
+ a= 256*(diff2[1] + shi.ambg +isg1);
if(a>255) col2[2]= 255;
else col2[2]= a;
- a= 256*(diff2[2] + ma->ambb +isb1);
+ a= 256*(diff2[2] + shi.ambb +isb1);
if(a>255) col2[1]= 255;
else col2[1]= a;
}
@@ -935,7 +936,7 @@ void shadeDispList(Object *ob)
ma= give_current_material(ob, a+1);
if(ma) {
init_render_material(ma);
- if(ma->ren->texco & TEXCO_ORCO) need_orco= 1;
+ if(ma->texco & TEXCO_ORCO) need_orco= 1;
}
}
@@ -2263,7 +2264,7 @@ void imagestodisplist(void)
ListBase _wireframe, *wireframe;
DispList *dl;
Segment *seg;
- float *data, xfac, yfac, xsi, ysi, vec[3];
+ float *data, xfac, yfac, xsi, ysi, vec[3], dum;
int tot;
_wireframe.first= 0;
@@ -2285,7 +2286,7 @@ void imagestodisplist(void)
tex= ma->mtex[0]->tex;
/* this takes care of correct loading of new imbufs */
- externtex(ma->mtex[0], vec);
+ externtex(ma->mtex[0], vec, &dum, &dum, &dum, &dum, &dum);
if(tex->type==TEX_IMAGE && tex->ima && tex->ima->ibuf) {
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 988d9abfd9b..fcadd35f427 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -35,6 +35,10 @@
#include <math.h>
#include <stdlib.h>
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
+
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
#include "DNA_effect_types.h"
@@ -71,6 +75,9 @@
#include "BKE_screen.h"
#include "BKE_utildefines.h"
+#include "render.h" // externtex, bad level call (ton)
+
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -311,39 +318,38 @@ void where_is_particle(PartEff *paf, Particle *pa, float ctime, float *vec)
void particle_tex(MTex *mtex, PartEff *paf, float *co, float *no)
{
- extern float Tin, Tr, Tg, Tb;
- extern void externtex(struct MTex *mtex, float *vec);
+ float tin, tr, tg, tb, ta;
float old;
- externtex(mtex, co);
+ externtex(mtex, co, &tin, &tr, &tg, &tb, &ta);
if(paf->texmap==PAF_TEXINT) {
- Tin*= paf->texfac;
- no[0]+= Tin*paf->defvec[0];
- no[1]+= Tin*paf->defvec[1];
- no[2]+= Tin*paf->defvec[2];
+ tin*= paf->texfac;
+ no[0]+= tin*paf->defvec[0];
+ no[1]+= tin*paf->defvec[1];
+ no[2]+= tin*paf->defvec[2];
}
else if(paf->texmap==PAF_TEXRGB) {
- no[0]+= (Tr-0.5f)*paf->texfac;
- no[1]+= (Tg-0.5f)*paf->texfac;
- no[2]+= (Tb-0.5f)*paf->texfac;
+ no[0]+= (tr-0.5f)*paf->texfac;
+ no[1]+= (tg-0.5f)*paf->texfac;
+ no[2]+= (tb-0.5f)*paf->texfac;
}
else { /* PAF_TEXGRAD */
- old= Tin;
+ old= tin;
co[0]+= paf->nabla;
- externtex(mtex, co);
- no[0]+= (old-Tin)*paf->texfac;
+ externtex(mtex, co, &tin, &tr, &tg, &tb, &ta);
+ no[0]+= (old-tin)*paf->texfac;
co[0]-= paf->nabla;
co[1]+= paf->nabla;
- externtex(mtex, co);
- no[1]+= (old-Tin)*paf->texfac;
+ externtex(mtex, co, &tin, &tr, &tg, &tb, &ta);
+ no[1]+= (old-tin)*paf->texfac;
co[1]-= paf->nabla;
co[2]+= paf->nabla;
- externtex(mtex, co);
- no[2]+= (old-Tin)*paf->texfac;
+ externtex(mtex, co, &tin, &tr, &tg, &tb, &ta);
+ no[2]+= (old-tin)*paf->texfac;
}
}
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index 2410255c6af..3347a193d80 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -123,6 +123,8 @@
#include "BPY_extern.h"
+#include "blendef.h"
+
static int is_dxf(char *str);
static void dxf_read(char *filename);
static int is_stl(char *str);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 0663fb2244e..50119cdf3a7 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -31,10 +31,6 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
@@ -50,57 +46,24 @@
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
-#include "DNA_texture_types.h"
#include "DNA_image_types.h"
+#include "DNA_texture_types.h"
#include "DNA_packedFile_types.h"
#include "BLI_blenlib.h"
-#include "BKE_bad_level_calls.h"
-#include "BKE_utildefines.h"
-
+#include "BKE_bmfont.h"
+#include "BKE_packedFile.h"
+#include "BKE_library.h"
#include "BKE_global.h"
#include "BKE_main.h"
-
#include "BKE_image.h"
-#include "BKE_bmfont.h"
-#include "BKE_screen.h"
+#include "BKE_scene.h"
#include "BKE_texture.h"
-#include "BKE_packedFile.h"
-#include "BKE_library.h"
-
-void clipx_rctf_swap(rctf *stack, short *count, float x1, float x2);
-void clipy_rctf_swap(rctf *stack, short *count, float y1, float y2);
-float square_rctf(rctf *rf);
-float clipx_rctf(rctf *rf, float x1, float x2);
-float clipy_rctf(rctf *rf, float y1, float y2);
-void boxsample(struct ImBuf *ibuf,
- float minx, float miny, float maxx, float maxy,
- float *rcol, float *gcol, float *bcol, float *acol);
-void boxsampleclip(struct ImBuf *ibuf, rctf *rf, float *rcol,
- float *gcol, float *bcol, float *acol);
-void filtersample(struct ImBuf *ibuf,
- float fx, float fy,
- float *rcol, float *gcol, float *bcol, float *acol);
-
-
-
-/* If defined: check arguments on call */
-/* #define IMAGE_C_ARG_CHECK */
-
-/* Communicate with texture channels. */
-extern float Tin, Tr, Tg, Tb, Ta;
-
-int Talpha;
-int imaprepeat, imapextend;
-
+#include "BKE_utildefines.h"
-/*
- *
- * Talpha==TRUE means: read alpha from image. This does not mean that Ta
- * should not be used, here info can be stored about outside edge of an image!
- *
- */
+/* bad level; call to free_realtime_image */
+#include "BKE_bad_level_calls.h"
void free_image_buffers(Image *ima)
{
@@ -249,6 +212,7 @@ void makepicstring(char *string, int frame)
/* ******** IMAGE WRAPPING INIT ************* */
+/* used by sequencer, texture */
void converttopremul(struct ImBuf *ibuf)
{
int x, y, val;
@@ -282,29 +246,7 @@ void converttopremul(struct ImBuf *ibuf)
}
}
-
-
-void makemipmap(Image *ima)
-{
- struct ImBuf *ibuf;
- int minsize, curmap=0;
-
- ibuf= ima->ibuf;
- minsize= MIN2(ibuf->x, ibuf->y);
-
- while(minsize>3 && curmap<BLI_ARRAY_NELEMS(ima->mipmap)) {
-
- ibuf= IMB_dupImBuf(ibuf);
- IMB_filter(ibuf);
- ima->mipmap[curmap]= (struct ImBuf *)IMB_onehalf(ibuf);
- IMB_freeImBuf(ibuf);
- ibuf= ima->mipmap[curmap];
-
- curmap++;
- minsize= MIN2(ibuf->x, ibuf->y);
- }
-}
-
+/* used by sequencer, texture */
struct anim *openanim(char * name, int flags)
{
struct anim * anim;
@@ -325,85 +267,36 @@ struct anim *openanim(char * name, int flags)
return(anim);
}
-int calcimanr(int cfra, Tex *tex)
-{
- int imanr, len, a, fra, dur;
- /* here (+fie_ima/2-1) makes sure that division happens correctly */
-
- if(tex->frames==0) return 1;
-
- cfra= cfra-tex->sfra+1;
-
- /* cyclic */
- if(tex->len==0) len= (tex->fie_ima*tex->frames)/2;
- else len= tex->len;
-
- if(tex->imaflag & TEX_ANIMCYCLIC) {
- cfra= ( (cfra) % len );
- if(cfra < 0) cfra+= len;
- if(cfra==0) cfra= len;
- }
-
- if(cfra<1) cfra= 1;
- else if(cfra>len) cfra= len;
-
- /* convert current frame to current field */
- cfra= 2*(cfra);
- if(R.flag & R_SEC_FIELD) cfra++;
-
- /* transform to images space */
- imanr= (cfra+tex->fie_ima-2)/tex->fie_ima;
- if(imanr>tex->frames) imanr= tex->frames;
- imanr+= tex->offset;
-
- if(tex->imaflag & TEX_ANIMCYCLIC) {
- imanr= ( (imanr) % len );
- while(imanr < 0) imanr+= len;
- if(imanr==0) imanr= len;
- }
+/*
+load_image handles reading the image from disk or from the packedfile.
+*/
- /* are there images that last longer? */
- for(a=0; a<4; a++) {
- if(tex->fradur[a][0]) {
-
- fra= tex->fradur[a][0];
- dur= tex->fradur[a][1]-1;
-
- while(dur>0 && imanr>fra) {
- imanr--;
- dur--;
- }
- }
- }
+void load_image(Image * ima, int flags, char *relabase, int framenum)
+{
+ char name[FILE_MAXDIR + FILE_MAXFILE];
- return imanr;
-}
+ if (ima->ibuf == NULL) {
-void do_laseroptics_patch(ImBuf *ibuf)
-{
- char *rt;
- float fac;
- int a, val;
-
- rt= (char *)ibuf->rect;
- a= ibuf->x*ibuf->y;
+ // is there a PackedFile with this image ?;
+ if (ima->packedfile) {
+ ima->ibuf = IMB_ibImageFromMemory((int *) ima->packedfile->data, ima->packedfile->size, flags);
+ } else {
+ strcpy(name, ima->name);
+ BLI_convertstringcode(name, relabase, framenum);
- if(ibuf->flags & IB_fields) a+= a;
+ ima->ibuf = IMB_loadiffname(name , flags);
+ }
+ // check if the image is a font image...
+ // printf("Checking for font\n");
- while(a--) {
-
- fac= (rt[1]+rt[2]+rt[3])/765.0f;
- val= (int)((255.0/0.8)*(fac-0.1));
-
- if(val<0) val= 0; else if(val>255) val= 255;
-
- rt[0]= rt[1]= rt[2]= rt[3]= val;
-
- rt+= 4;
+ if (ima->ibuf) {
+ detectBitmapFont(ima->ibuf);
+ }
}
}
+
void de_interlace_ng(struct ImBuf *ibuf) /* neogeo fields */
{
struct ImBuf * tbuf1, * tbuf2;
@@ -421,7 +314,7 @@ void de_interlace_ng(struct ImBuf *ibuf) /* neogeo fields */
/* These rectop calls are broken!!! I added a trailing 0 arg... */
IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
IMB_rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, IMB_rectcpy, 0);
-
+
ibuf->x /= 2;
IMB_rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
IMB_rectop(ibuf, tbuf2, 0, tbuf2->y, 0, 0, 32767, 32767, IMB_rectcpy, 0);
@@ -449,7 +342,7 @@ void de_interlace_st(struct ImBuf *ibuf) /* standard fields */
/* These are brolenm as well... */
IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
IMB_rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, IMB_rectcpy, 0);
-
+
ibuf->x /= 2;
IMB_rectop(ibuf, tbuf2, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
IMB_rectop(ibuf, tbuf1, 0, tbuf2->y, 0, 0, 32767, 32767, IMB_rectcpy, 0);
@@ -460,33 +353,6 @@ void de_interlace_st(struct ImBuf *ibuf) /* standard fields */
ibuf->y /= 2;
}
-/*
-load_image handles reading the image from disk or from the packedfile.
-*/
-
-void load_image(Image * ima, int flags, char *relabase, int framenum)
-{
- char name[FILE_MAXDIR + FILE_MAXFILE];
-
- if (ima->ibuf == NULL) {
-
- // is there a PackedFile with this image ?;
- if (ima->packedfile) {
- ima->ibuf = IMB_ibImageFromMemory((int *) ima->packedfile->data, ima->packedfile->size, flags);
- } else {
- strcpy(name, ima->name);
- BLI_convertstringcode(name, relabase, framenum);
-
- ima->ibuf = IMB_loadiffname(name , flags);
- }
- // check if the image is a font image...
- // printf("Checking for font\n");
-
- if (ima->ibuf) {
- detectBitmapFont(ima->ibuf);
- }
- }
-}
void ima_ibuf_is_nul(Tex *tex)
{
@@ -494,39 +360,37 @@ void ima_ibuf_is_nul(Tex *tex)
Image *ima;
int a, fra, dur;
char str[FILE_MAXDIR+FILE_MAXFILE], *cp;
-
+
ima= tex->ima;
if(ima==0) return;
-
- waitcursor(1);
-
+
strcpy(str, ima->name);
BLI_convertstringcode(str, G.sce, G.scene->r.cfra);
if(tex->imaflag & TEX_STD_FIELD) de_interlacefunc= de_interlace_st;
else de_interlacefunc= de_interlace_ng;
-
- if(tex->imaflag & TEX_ANIM5) {
+ if(tex->imaflag & TEX_ANIM5) {
+
if(ima->anim==0) ima->anim = openanim(str, IB_cmap | IB_rect);
if (ima->anim) {
dur = IMB_anim_get_duration(ima->anim);
ima->lastquality= R.osa;
fra= ima->lastframe-1;
-
+
if(fra<0) fra = 0;
if(fra>(dur-1)) fra= dur-1;
ima->ibuf = IMB_anim_absolute(ima->anim, fra);
-
+
/* patch for textbutton with name ima (B_NAMEIMA) */
if(ima->ibuf) {
strcpy(ima->ibuf->name, ima->name);
if (tex->imaflag & TEX_FIELDS) de_interlacefunc(ima->ibuf);
}
}
- else error("Not an anim");
-
+ else printf("Not an anim");
+
} else {
// create a packedfile for this image when autopack is on
// for performance (IMB_loadiffname uses mmap) we don't do this by default
@@ -535,7 +399,7 @@ void ima_ibuf_is_nul(Tex *tex)
}
load_image(ima, IB_rect, G.sce, G.scene->r.cfra);
-
+
if (tex->imaflag & TEX_FIELDS) de_interlacefunc(ima->ibuf);
ima->lastquality= R.osa;
@@ -549,15 +413,15 @@ void ima_ibuf_is_nul(Tex *tex)
if(ima->ibuf->cmap) {
if(tex->imaflag & TEX_ANIM5) {
-
+
if(tex->imaflag & TEX_MORKPATCH) {
- /**** PATCH TO SET COLOR 2 RIGHT (neogeo..) */
+ /**** PATCH TO SET COLOR 2 RIGHT (neogeo..) */
if(ima->ibuf->maxcol > 4) {
cp= (char *)(ima->ibuf->cmap+2);
cp[0]= 0x80;
}
}
-
+
IMB_applycmap(ima->ibuf);
IMB_convert_rgba_to_abgr(ima->ibuf->x*ima->ibuf->y, ima->ibuf->rect);
@@ -582,989 +446,8 @@ void ima_ibuf_is_nul(Tex *tex)
if(ima->mipmap[a]) IMB_freeImBuf(ima->mipmap[a]);
ima->mipmap[a]= 0;
}
-
- if((R.flag & R_RENDERING)==0) waitcursor(0);
}
-/* *********** IMAGEWRAPPING ****************** */
-
-
-int imagewrap(Tex *tex, float *texvec)
-{
- Image *ima;
- struct ImBuf *ibuf;
- float fx, fy, val1, val2, val3;
- int ofs, x, y;
- char *rect;
-
- Tin= Ta= Tr= Tg= Tb= 0.0;
- ima= tex->ima;
- if(ima==0 || ima->ok== 0) {
- return 0;
- }
-
- if(ima->ibuf==0) ima_ibuf_is_nul(tex);
-
- if (ima->ok) {
- ibuf = ima->ibuf;
-
- if(tex->imaflag & TEX_IMAROT) {
- fy= texvec[0];
- fx= texvec[1];
- }
- else {
- fx= texvec[0];
- fy= texvec[1];
- }
-
- if(tex->extend == TEX_CHECKER) {
- int xs, ys;
-
- xs= (int)floor(fx);
- ys= (int)floor(fy);
- fx-= xs;
- fy-= ys;
-
- if( (tex->flag & TEX_CHECKER_ODD)==0) {
- if((xs+ys) & 1);else return 0;
- }
- if( (tex->flag & TEX_CHECKER_EVEN)==0) {
- if((xs+ys) & 1) return 0;
- }
- /* scale around center, (0.5, 0.5) */
- if(tex->checkerdist<1.0) {
- fx= (fx-0.5)/(1.0-tex->checkerdist) +0.5;
- fy= (fy-0.5)/(1.0-tex->checkerdist) +0.5;
- }
- }
-
- x = (int)(fx*ibuf->x);
- y = (int)(fy*ibuf->y);
-
- if(tex->extend == TEX_CLIPCUBE) {
- if(x<0 || y<0 || x>=ibuf->x || y>=ibuf->y || texvec[2]<-1.0 || texvec[2]>1.0) {
- return 0;
- }
- }
- else if( tex->extend==TEX_CLIP || tex->extend==TEX_CHECKER) {
- if(x<0 || y<0 || x>=ibuf->x || y>=ibuf->y) {
- return 0;
- }
- }
- else {
- if(tex->extend==TEX_EXTEND) {
- if(x>=ibuf->x) x = ibuf->x-1;
- else if(x<0) x= 0;
- }
- else {
- x= x % ibuf->x;
- if(x<0) x+= ibuf->x;
- }
- if(tex->extend==TEX_EXTEND) {
- if(y>=ibuf->y) y = ibuf->y-1;
- else if(y<0) y= 0;
- }
- else {
- y= y % ibuf->y;
- if(y<0) y+= ibuf->y;
- }
- }
-
- /* warning, no return before setting back! */
- if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
- ibuf->rect+= (ibuf->x*ibuf->y);
- }
-
- ofs = y * ibuf->x + x;
- rect = (char *)( ibuf->rect+ ofs);
-
- if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
- ibuf->rect-= (ibuf->x*ibuf->y);
- }
-
- Talpha= 0;
- if(tex->imaflag & TEX_USEALPHA) {
- if(tex->imaflag & TEX_CALCALPHA);
- else Talpha= 1;
- }
-
- Tr = ((float)rect[0])/255.0f;
- Tg = ((float)rect[1])/255.0f;
- Tb = ((float)rect[2])/255.0f;
-
- if(tex->nor) {
- if(tex->imaflag & TEX_NORMALMAP) {
- tex->nor[0]= 0.5-Tr;
- tex->nor[1]= 0.5-Tg;
- tex->nor[2]= -Tb;
- }
- else {
- /* bump: take three samples */
- val1= Tr+Tg+Tb;
-
- if(x<ibuf->x-1) {
- rect+=4;
- val2= ((float)(rect[0]+rect[1]+rect[2]))/255.0f;
- rect-=4;
- }
- else val2= val1;
-
- if(y<ibuf->y-1) {
- rect+= 4*ibuf->x;
- val3= ((float)(rect[0]+rect[1]+rect[2]))/255.0f;
- }
- else val3= val1;
-
- /* do not mix up x and y here! */
- tex->nor[0]= (val1-val2);
- tex->nor[1]= (val1-val3);
- }
- }
-
- BRICONRGB;
-
- if(Talpha) Ta= Tin= ((float)rect[3])/255.0f;
- else if(tex->imaflag & TEX_CALCALPHA) {
- Ta= Tin= MAX3(Tr, Tg, Tb);
- }
- else Ta= Tin= 1.0;
-
- if(tex->flag & TEX_NEGALPHA) Ta= 1.0f-Ta;
-
- }
-
- if(tex->nor) return 3;
- else return 1;
-}
-
-void clipx_rctf_swap(rctf *stack, short *count, float x1, float x2)
-/* rctf *stack; */
-/* short *count; */
-/* float x1, x2; */
-{
- rctf *rf, *newrct;
- short a;
-
- a= *count;
- rf= stack;
- for(;a>0;a--) {
- if(rf->xmin<x1) {
- if(rf->xmax<x1) {
- rf->xmin+= (x2-x1);
- rf->xmax+= (x2-x1);
- }
- else {
- if(rf->xmax>x2) rf->xmax= x2;
- newrct= stack+ *count;
- (*count)++;
-
- newrct->xmax= x2;
- newrct->xmin= rf->xmin+(x2-x1);
- newrct->ymin= rf->ymin;
- newrct->ymax= rf->ymax;
-
- if(newrct->xmin==newrct->xmax) (*count)--;
-
- rf->xmin= x1;
- }
- }
- else if(rf->xmax>x2) {
- if(rf->xmin>x2) {
- rf->xmin-= (x2-x1);
- rf->xmax-= (x2-x1);
- }
- else {
- if(rf->xmin<x1) rf->xmin= x1;
- newrct= stack+ *count;
- (*count)++;
-
- newrct->xmin= x1;
- newrct->xmax= rf->xmax-(x2-x1);
- newrct->ymin= rf->ymin;
- newrct->ymax= rf->ymax;
-
- if(newrct->xmin==newrct->xmax) (*count)--;
-
- rf->xmax= x2;
- }
- }
- rf++;
- }
-
-}
-
-void clipy_rctf_swap(rctf *stack, short *count, float y1, float y2)
-/* rctf *stack; */
-/* short *count; */
-/* float y1, y2; */
-{
- rctf *rf, *newrct;
- short a;
-
- a= *count;
- rf= stack;
- for(;a>0;a--) {
- if(rf->ymin<y1) {
- if(rf->ymax<y1) {
- rf->ymin+= (y2-y1);
- rf->ymax+= (y2-y1);
- }
- else {
- if(rf->ymax>y2) rf->ymax= y2;
- newrct= stack+ *count;
- (*count)++;
-
- newrct->ymax= y2;
- newrct->ymin= rf->ymin+(y2-y1);
- newrct->xmin= rf->xmin;
- newrct->xmax= rf->xmax;
-
- if(newrct->ymin==newrct->ymax) (*count)--;
-
- rf->ymin= y1;
- }
- }
- else if(rf->ymax>y2) {
- if(rf->ymin>y2) {
- rf->ymin-= (y2-y1);
- rf->ymax-= (y2-y1);
- }
- else {
- if(rf->ymin<y1) rf->ymin= y1;
- newrct= stack+ *count;
- (*count)++;
-
- newrct->ymin= y1;
- newrct->ymax= rf->ymax-(y2-y1);
- newrct->xmin= rf->xmin;
- newrct->xmax= rf->xmax;
-
- if(newrct->ymin==newrct->ymax) (*count)--;
-
- rf->ymax= y2;
- }
- }
- rf++;
- }
-
-}
-
-
-
-float square_rctf(rctf *rf)
-/* rctf *rf; */
-{
- float x, y;
-
- x= rf->xmax- rf->xmin;
- y= rf->ymax- rf->ymin;
- return (x*y);
-}
-
-float clipx_rctf(rctf *rf, float x1, float x2)
-/* rctf *rf; */
-/* float x1, x2; */
-{
- float size;
-
- size= rf->xmax - rf->xmin;
-
- if(rf->xmin<x1) {
- rf->xmin= x1;
- }
- if(rf->xmax>x2) {
- rf->xmax= x2;
- }
- if(rf->xmin > rf->xmax) {
- rf->xmin = rf->xmax;
- return 0.0;
- }
- else if(size!=0.0) {
- return (rf->xmax - rf->xmin)/size;
- }
- return 1.0;
-}
-
-float clipy_rctf(rctf *rf, float y1, float y2)
-/* rctf *rf; */
-/* float y1, y2; */
-{
- float size;
-
- size= rf->ymax - rf->ymin;
-/* PRINT(f, size); */
- if(rf->ymin<y1) {
- rf->ymin= y1;
- }
- if(rf->ymax>y2) {
- rf->ymax= y2;
- }
-/* PRINT(f, size); */
- if(rf->ymin > rf->ymax) {
- rf->ymin = rf->ymax;
- return 0.0;
- }
- else if(size!=0.0) {
- return (rf->ymax - rf->ymin)/size;
- }
- return 1.0;
-
-}
-
-void boxsampleclip(struct ImBuf *ibuf, rctf *rf, float *rcol,
- float *gcol, float *bcol, float *acol) /* return color 0.0-1.0 */
-/* struct ImBuf *ibuf; */
-/* rctf *rf; */
-/* float *rcol, *gcol, *bcol, *acol; */
-{
- /* sample box, is clipped already, and minx etc. have been set at ibuf size.
- Enlarge with antialiased edges of the pixels */
-
- float muly,mulx,div;
- int ofs;
- int x, y, startx, endx, starty, endy;
- char *rect;
-
- startx= (int)floor(rf->xmin);
- endx= (int)floor(rf->xmax);
- starty= (int)floor(rf->ymin);
- endy= (int)floor(rf->ymax);
-
- if(startx < 0) startx= 0;
- if(starty < 0) starty= 0;
- if(endx>=ibuf->x) endx= ibuf->x-1;
- if(endy>=ibuf->y) endy= ibuf->y-1;
-
- if(starty==endy && startx==endx) {
-
- ofs = starty*ibuf->x + startx;
- rect = (char *)(ibuf->rect +ofs);
- *rcol= ((float)rect[0])/255.0f;
- *gcol= ((float)rect[1])/255.0f;
- *bcol= ((float)rect[2])/255.0f;
- /* alpha is global, has been set in function imagewraposa() */
- if(Talpha) {
- *acol= ((float)rect[3])/255.0f;
- }
- }
- else {
- div= *rcol= *gcol= *bcol= *acol= 0.0;
- for(y=starty;y<=endy;y++) {
- ofs = y*ibuf->x +startx;
- rect = (char *)(ibuf->rect+ofs);
-
- muly= 1.0;
-
- if(starty==endy);
- else {
- if(y==starty) muly= 1.0f-(rf->ymin - y);
- if(y==endy) muly= (rf->ymax - y);
- }
- if(startx==endx) {
- mulx= muly;
- if(Talpha) *acol+= mulx*rect[3];
- *rcol+= mulx*rect[0];
- *gcol+= mulx*rect[1];
- *bcol+= mulx*rect[2];
- div+= mulx;
- }
- else {
- for(x=startx;x<=endx;x++) {
- mulx= muly;
- if(x==startx) mulx*= 1.0f-(rf->xmin - x);
- if(x==endx) mulx*= (rf->xmax - x);
-
- if(mulx==1.0) {
- if(Talpha) *acol+= rect[3];
- *rcol+= rect[0];
- *gcol+= rect[1];
- *bcol+= rect[2];
- div+= 1.0;
- }
- else {
- if(Talpha) *acol+= mulx*rect[3];
- *rcol+= mulx*rect[0];
- *gcol+= mulx*rect[1];
- *bcol+= mulx*rect[2];
- div+= mulx;
- }
- rect+=4;
- }
- }
- }
- if(div!=0.0) {
- div*= 255.0;
-
- *bcol/= div;
- *gcol/= div;
- *rcol/= div;
-
- if(Talpha) *acol/= div;
- }
- else {
- *rcol= *gcol= *bcol= *acol= 0.0;
- }
- }
-}
-
-void boxsample(struct ImBuf *ibuf,
- float minx, float miny, float maxx, float maxy,
- float *rcol, float *gcol, float *bcol, float *acol) /* return color 0.0-1.0 */
-/* struct ImBuf *ibuf; */
-/* float minx, miny, maxx, maxy; */
-/* float *rcol, *gcol, *bcol, *acol; */
-{
- /* Sample box, performs clip. minx etc are in range 0.0 - 1.0 .
- * Enlarge with antialiased edges of pixels.
- * If global variable 'imaprepeat' has been set, the
- * clipped-away parts are sampled as well.
- */
- rctf *rf, stack[8];
- float opp, tot, r, g, b, a, alphaclip= 1.0;
- short count=1;
-
- rf= stack;
- rf->xmin= minx*(ibuf->x);
- rf->xmax= maxx*(ibuf->x);
- rf->ymin= miny*(ibuf->y);
- rf->ymax= maxy*(ibuf->y);
-
- if(imapextend);
- else if(imaprepeat) clipx_rctf_swap(stack, &count, 0.0, (float)(ibuf->x));
- else {
- alphaclip= clipx_rctf(rf, 0.0, (float)(ibuf->x));
-
- if(alphaclip<=0.0) {
- *rcol= *bcol= *gcol= *acol= 0.0;
- return;
- }
- }
-
- if(imapextend);
- else if(imaprepeat) clipy_rctf_swap(stack, &count, 0.0, (float)(ibuf->y));
- else {
- alphaclip*= clipy_rctf(rf, 0.0, (float)(ibuf->y));
-
- if(alphaclip<=0.0) {
- *rcol= *bcol= *gcol= *acol= 0.0;
- return;
- }
- }
-
- if(count>1) {
- tot= *rcol= *bcol= *gcol= *acol= 0.0;
- while(count--) {
- boxsampleclip(ibuf, rf, &r, &g, &b, &a);
-
- opp= square_rctf(rf);
- tot+= opp;
-
- *rcol+= opp*r;
- *gcol+= opp*g;
- *bcol+= opp*b;
- if(Talpha) *acol+= opp*a;
- rf++;
- }
- if(tot!= 0.0) {
- *rcol/= tot;
- *gcol/= tot;
- *bcol/= tot;
- if(Talpha) *acol/= tot;
- }
- }
- else {
- boxsampleclip(ibuf, rf, rcol, gcol, bcol, acol);
- }
-
- if(Talpha==0) *acol= 1.0;
-
- if(alphaclip!=1.0) {
- /* this is for laetr investigation, premul or not? */
- /* *rcol*= alphaclip; */
- /* *gcol*= alphaclip; */
- /* *bcol*= alphaclip; */
- *acol*= alphaclip;
- }
-}
-
-void filtersample(struct ImBuf *ibuf,
- float fx, float fy,
- float *rcol, float *gcol, float *bcol, float *acol)
- /* return color 0.0-1.0 */
-/* struct ImBuf *ibuf; */ /* fx en fy tussen 0.0 en 1.0 */
-/* float fx, fy; */
-/* float *rcol, *gcol, *bcol, *acol; */
-{
- /* with weighted filter 3x3
- * left or right collumn is always 0
- * upper or lower row is awlays 0
- */
-
- int fac, fac1, fac2, fracx, fracy, filt[4];
- int ix, iy, x4;
- unsigned int r=0, g=0, b=0, a=0;
- char *rowcol, *rfilt[4];
-
- ix= (int)( 256.0*fx );
- fracx= (ix & 255);
- ix= (ix>>8);
- iy= (int)( 256.0*fy );
- fracy= (iy & 255);
- iy= (iy>>8);
-
- if(ix>=ibuf->x) ix= ibuf->x-1;
- if(iy>=ibuf->y) iy= ibuf->y-1;
-
- rowcol= (char *)(ibuf->rect+ iy*ibuf->x +ix);
-
- rfilt[0]= rfilt[1]= rfilt[2]= rfilt[3]= rowcol;
- x4= 4*ibuf->x;
-
- if(fracx<128) {
- if(ix>0) {
- rfilt[0]-= 4;
- rfilt[2]-=4;
- }
- else if(imaprepeat) {
- rfilt[0]+= x4-4;
- rfilt[2]+= x4-4;
- }
-
- if(fracy<128) {
- /* case left-under */
- fac1= 128+fracy;
- fac2= 128-fracy;
-
- if(iy>0) {
- rfilt[3]-= x4;
- rfilt[2]-= x4;
- }
- else if(imaprepeat) {
- fac= x4*(ibuf->y-1) ;
- rfilt[3]+= fac;
- rfilt[2]+= fac;
- }
- }
- else {
- /* case left-upper */
- fac2= 384-fracy;
- fac1= fracy-128;
-
- if(iy<ibuf->y-1) {
- rfilt[1]+= x4;
- rfilt[0]+= x4;
- }
- else if(imaprepeat) {
- fac= x4*(ibuf->y-1) ;
- rfilt[1]-= fac;
- rfilt[0]-= fac;
- }
- }
-
- filt[1]=filt[3]= 128+ fracx;
- filt[0]=filt[2]= 128- fracx;
- filt[0]*= fac1;
- filt[1]*= fac1;
- filt[2]*= fac2;
- filt[3]*= fac2;
- }
- else {
- if(fracy<128) {
- /* case right-under */
- fac1= 128+fracy;
- fac2= 128-fracy;
-
- if(iy>0) {
- rfilt[3]-= x4;
- rfilt[2]-= x4;
- }
- else if(imaprepeat) {
- fac= x4*(ibuf->y-1) ;
- rfilt[3]+= fac;
- rfilt[2]+= fac;
- }
- }
- else {
- /* case right-upper */
- fac2= 384-fracy;
- fac1= fracy-128;
-
- if(iy<ibuf->y-1) {
- rfilt[1]+= x4;
- rfilt[0]+= x4;
- }
- else if(imaprepeat) {
- fac= x4*(ibuf->y-1) ;
- rfilt[1]-= fac;
- rfilt[0]-= fac;
- }
- }
- filt[0]=filt[2]= 384-fracx;
- filt[1]=filt[3]= fracx-128;
- filt[0]*= fac1;
- filt[1]*= fac1;
- filt[2]*= fac2;
- filt[3]*= fac2;
-
- if(ix<ibuf->x-1) {
- rfilt[1]+= 4;
- rfilt[3]+=4;
- }
- else if(imaprepeat) {
- rfilt[1]-= x4-4;
- rfilt[3]-= x4-4;
- }
- }
-
- for(fac=3; fac>=0; fac--) {
- rowcol= rfilt[fac];
- r+= filt[fac]*rowcol[0];
- g+= filt[fac]*rowcol[1];
- b+= filt[fac]*rowcol[2];
- if(Talpha) a+= filt[fac]*rowcol[3]; /* alpha is global */
- }
- *rcol= ((float)r)/16777216.0f;
- *gcol= ((float)g)/16777216.0f;
- *bcol= ((float)b)/16777216.0f;
- if(Talpha) *acol= ((float)a)/16777216.0f;
-
-}
-
-
-int imagewraposa(Tex *tex, float *texvec, float *dxt, float *dyt)
-{
- struct Image *ima;
- struct ImBuf *ibuf, *previbuf;
- float fx, fy, minx, maxx, miny, maxy, dx, dy, fac1, fac2, fac3, fac4;
- float maxd, pixsize, val1, val2, val3;
- int curmap;
-
-#ifdef IMAGE_C_ARG_CHECK
- if (!tex) {
- printf("imagewraposa: null pointer to texture\n");
- }
-#endif
-
- ima= tex->ima;
-#ifdef IMAGE_C_ARG_CHECK
- if (!ima) {
- printf("imagewraposa: null pointer to image\n");
- }
-#endif
-
- Tin= Ta= Tr= Tg= Tb= 0.0;
-
- if(ima==0 || ima->ok== 0) {
- return 0;
- }
-
- if(ima->ibuf==0) ima_ibuf_is_nul(tex);
-
- if (ima->ok) {
-
- if(tex->imaflag & TEX_MIPMAP) {
- if(ima->mipmap[0]==0) makemipmap(ima);
- }
-
- ibuf = ima->ibuf;
-
- Talpha= 0;
- if(tex->imaflag & TEX_USEALPHA) {
- if(tex->imaflag & TEX_CALCALPHA);
- else Talpha= 1;
- }
-
- if(tex->imaflag & TEX_IMAROT) {
- fy= texvec[0];
- fx= texvec[1];
- }
- else {
- fx= texvec[0];
- fy= texvec[1];
- }
-
- if(ibuf->flags & IB_fields) {
- if(R.r.mode & R_FIELDS) { /* field render */
- if(R.flag & R_SEC_FIELD) { /* correction for 2nd field */
- /* fac1= 0.5/( (float)ibuf->y ); */
- /* fy-= fac1; */
- }
- else { /* first field */
- fac1= 0.5f/( (float)ibuf->y );
- fy+= fac1;
- }
- }
- }
-
- /* pixel coordinates */
-
- minx= MIN3(dxt[0],dyt[0],dxt[0]+dyt[0] );
- maxx= MAX3(dxt[0],dyt[0],dxt[0]+dyt[0] );
- miny= MIN3(dxt[1],dyt[1],dxt[1]+dyt[1] );
- maxy= MAX3(dxt[1],dyt[1],dxt[1]+dyt[1] );
-
- /* tex_sharper has been removed */
-
- minx= tex->filtersize*(maxx-minx)/2.0f;
- miny= tex->filtersize*(maxy-miny)/2.0f;
-
- if(tex->imaflag & TEX_IMAROT) SWAP(float, minx, miny);
-
- if(minx>0.25) minx= 0.25;
- else if(minx<0.00001f) minx= 0.00001f; /* side faces of unit-cube */
- if(miny>0.25) miny= 0.25;
- else if(miny<0.00001f) miny= 0.00001f;
-
-
- /* repeat and clip */
-
- /* watch it: imaprepeat is global value (see boxsample) */
- imaprepeat= (tex->extend==TEX_REPEAT);
- imapextend= (tex->extend==TEX_EXTEND);
-
- if(tex->extend == TEX_CHECKER) {
- int xs, ys, xs1, ys1, xs2, ys2, boundary;
-
- xs= (int)floor(fx);
- ys= (int)floor(fy);
-
- // both checkers available, no boundary exceptions, checkerdist will eat aliasing
- if( (tex->flag & TEX_CHECKER_ODD) && (tex->flag & TEX_CHECKER_EVEN) ) {
- fx-= xs;
- fy-= ys;
- }
- else {
-
- xs1= (int)floor(fx-minx);
- ys1= (int)floor(fy-miny);
- xs2= (int)floor(fx+minx);
- ys2= (int)floor(fy+miny);
- boundary= (xs1!=xs2) || (ys1!=ys2);
-
- if(boundary==0) {
- if( (tex->flag & TEX_CHECKER_ODD)==0) {
- if((xs+ys) & 1);
- else return 0;
- }
- if( (tex->flag & TEX_CHECKER_EVEN)==0) {
- if((xs+ys) & 1) return 0;
- }
- fx-= xs;
- fy-= ys;
- }
- else {
- if(tex->flag & TEX_CHECKER_ODD) {
- if((xs1+ys) & 1) fx-= xs2;
- else fx-= xs1;
-
- if((ys1+xs) & 1) fy-= ys2;
- else fy-= ys1;
- }
- if(tex->flag & TEX_CHECKER_EVEN) {
- if((xs1+ys) & 1) fx-= xs1;
- else fx-= xs2;
-
- if((ys1+xs) & 1) fy-= ys1;
- else fy-= ys2;
- }
- }
- }
-
- /* scale around center, (0.5, 0.5) */
- if(tex->checkerdist<1.0) {
- fx= (fx-0.5)/(1.0-tex->checkerdist) +0.5;
- fy= (fy-0.5)/(1.0-tex->checkerdist) +0.5;
- minx/= (1.0-tex->checkerdist);
- miny/= (1.0-tex->checkerdist);
- }
- }
-
- if(tex->extend == TEX_CLIPCUBE) {
- if(fx+minx<0.0 || fy+miny<0.0 || fx-minx>1.0 || fy-miny>1.0 || texvec[2]<-1.0 || texvec[2]>1.0) {
- return 0;
- }
- }
- else if(tex->extend==TEX_CLIP || tex->extend==TEX_CHECKER) {
- if(fx+minx<0.0 || fy+miny<0.0 || fx-minx>1.0 || fy-miny>1.0) {
- return 0;
- }
- }
- else {
- if(tex->extend==TEX_EXTEND) {
- if(fx>1.0) fx = 1.0;
- else if(fx<0.0) fx= 0.0;
- }
- else {
- if(fx>1.0) fx -= (int)(fx);
- else if(fx<0.0) fx+= 1-(int)(fx);
- }
-
- if(tex->extend==TEX_EXTEND) {
- if(fy>1.0) fy = 1.0;
- else if(fy<0.0) fy= 0.0;
- }
- else {
- if(fy>1.0) fy -= (int)(fy);
- else if(fy<0.0) fy+= 1-(int)(fy);
- }
- }
-
- /* warning no return! */
- if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
- ibuf->rect+= (ibuf->x*ibuf->y);
- }
-
- /* choice: */
- if(tex->imaflag & TEX_MIPMAP) {
-
- dx= minx;
- dy= miny;
- maxd= MAX2(dx, dy);
- if(maxd>0.5) maxd= 0.5;
-
- pixsize = 1.0f/ (float) MIN2(ibuf->x, ibuf->y);
-
- curmap= 0;
- previbuf= ibuf;
- while(curmap<BLI_ARRAY_NELEMS(ima->mipmap) && ima->mipmap[curmap]) {
- if(maxd < pixsize) break;
- previbuf= ibuf;
- ibuf= ima->mipmap[curmap];
- pixsize= 1.0f / (float)MIN2(ibuf->x, ibuf->y); /* this used to be 1.0 */
- curmap++;
- }
-
- if(previbuf!=ibuf || (tex->imaflag & TEX_INTERPOL)) {
- /* sample at least 1 pixel */
- if (minx < 0.5f / ima->ibuf->x) minx = 0.5f / ima->ibuf->x;
- if (miny < 0.5f / ima->ibuf->y) miny = 0.5f / ima->ibuf->y;
- }
-
- if(tex->nor && (tex->imaflag & TEX_NORMALMAP)==0) {
- /* a bit extra filter */
- minx*= 1.35f;
- miny*= 1.35f;
-
- boxsample(ibuf, fx-2.0f*minx, fy-2.0f*miny, fx+minx, fy+miny, &Tr, &Tg, &Tb, &Ta);
- val1= Tr+Tg+Tb;
- boxsample(ibuf, fx-minx, fy-2.0f*miny, fx+2.0f*minx, fy+miny, &fac1, &fac2, &fac3, &fac4);
- val2= fac1+fac2+fac3;
- boxsample(ibuf, fx-2.0f*minx, fy-miny, fx+minx, fy+2.0f*miny, &fac1, &fac2, &fac3, &fac4);
- val3= fac1+fac2+fac3;
-
- if(previbuf!=ibuf) { /* interpolate */
-
- boxsample(previbuf, fx-2.0f*minx, fy-2.0f*miny, fx+minx, fy+miny, &fac1, &fac2, &fac3, &fac4);
-
- /* calc rgb */
- dx= 2.0f*(pixsize-maxd)/pixsize;
- if(dx>=1.0f) {
- Ta= fac4; Tb= fac3;
- Tg= fac2; Tr= fac1;
- }
- else {
- dy= 1.0f-dx;
- Tb= dy*Tb+ dx*fac3;
- Tg= dy*Tg+ dx*fac2;
- Tr= dy*Tr+ dx*fac1;
- if(Talpha) Ta= dy*Ta+ dx*fac4;
- }
-
- val1= dy*val1+ dx*(fac1+fac2+fac3);
- boxsample(previbuf, fx-minx, fy-2.0f*miny, fx+2.0f*minx, fy+miny, &fac1, &fac2, &fac3, &fac4);
- val2= dy*val2+ dx*(fac1+fac2+fac3);
- boxsample(previbuf, fx-2.0f*minx, fy-miny, fx+minx, fy+2.0f*miny, &fac1, &fac2, &fac3, &fac4);
- val3= dy*val3+ dx*(fac1+fac2+fac3);
- }
-
- /* don't switch x or y! */
- tex->nor[0]= (val1-val2);
- tex->nor[1]= (val1-val3);
- }
- else {
- maxx= fx+minx;
- minx= fx-minx;
- maxy= fy+miny;
- miny= fy-miny;
-
- boxsample(ibuf, minx, miny, maxx, maxy, &Tr, &Tg, &Tb, &Ta);
-
- if(previbuf!=ibuf) { /* interpolate */
- boxsample(previbuf, minx, miny, maxx, maxy, &fac1, &fac2, &fac3, &fac4);
-
- fx= 2.0f*(pixsize-maxd)/pixsize;
-
- if(fx>=1.0) {
- Ta= fac4; Tb= fac3;
- Tg= fac2; Tr= fac1;
- } else {
- fy= 1.0f-fx;
- Tb= fy*Tb+ fx*fac3;
- Tg= fy*Tg+ fx*fac2;
- Tr= fy*Tr+ fx*fac1;
- if(Talpha) Ta= fy*Ta+ fx*fac4;
- }
- }
- }
- }
- else {
- if((tex->imaflag & TEX_INTERPOL)) {
- /* sample 1 pixel minimum */
- if (minx < 0.5f / ima->ibuf->x) minx = 0.5f / ima->ibuf->x;
- if (miny < 0.5f / ima->ibuf->y) miny = 0.5f / ima->ibuf->y;
- }
-
- if(tex->nor && (tex->imaflag & TEX_NORMALMAP)==0) {
-
- /* a bit extra filter */
- minx*= 1.35f;
- miny*= 1.35f;
-
- boxsample(ibuf, fx-2.0f*minx, fy-2.0f*miny, fx+minx, fy+miny, &Tr, &Tg, &Tb, &Ta);
- val1= Tr+Tg+Tb;
-
- boxsample(ibuf, fx-minx, fy-2.0f*miny, fx+2.0f*minx, fy+miny, &fac1, &fac2, &fac3, &fac4);
- val2= fac1+fac2+fac3;
-
- boxsample(ibuf, fx-2.0f*minx, fy-miny, fx+miny, fy+2.0f*miny, &fac1, &fac2, &fac3, &fac4);
- val3= fac1+fac2+fac3;
-
- /* don't switch x or y! */
- tex->nor[0]= (val1-val2);
- tex->nor[1]= (val1-val3);
- }
- else {
- boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, &Tr, &Tg, &Tb, &Ta);
- }
- }
-
- BRICONRGB;
-
- if(tex->imaflag & TEX_CALCALPHA) {
- Ta= Tin= Ta*MAX3(Tr, Tg, Tb);
- }
- else Tin= Ta;
- if(tex->flag & TEX_NEGALPHA) Ta= 1.0f-Ta;
-
- if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
- ibuf->rect-= (ibuf->x*ibuf->y);
- }
-
- if(tex->nor && (tex->imaflag & TEX_NORMALMAP)) {
- tex->nor[0]= 0.5-Tr;
- tex->nor[1]= 0.5-Tg;
- tex->nor[2]= -Tb;
- }
- }
- else {
- Tin= 0.0f;
- return 0;
- }
-
- if(tex->nor) return 3;
- else return 1;
-}
-
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 71e19c040c5..f89b36a50cf 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -59,9 +59,7 @@
#include "BPY_extern.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include "render.h"
void free_material(Material *ma)
{
@@ -70,9 +68,6 @@ void free_material(Material *ma)
BPY_free_scriptlink(&ma->scriptlink);
- if(ma->ren) MEM_freeN(ma->ren);
- ma->ren= NULL;
-
for(a=0; a<MAX_MTEX; a++) {
mtex= ma->mtex[a];
if(mtex && mtex->tex) mtex->tex->id.us--;
@@ -543,15 +538,9 @@ void init_render_material(Material *ma)
MTex *mtex;
int a, needuv=0;
- if(ma->ren) return;
-
if(ma->flarec==0) ma->flarec= 1;
- ma->ren= MEM_mallocN(sizeof(Material), "initrendermaterial");
- memcpy(ma->ren, ma, sizeof(Material));
-
/* add all texcoflags from mtex */
- ma= ma->ren;
ma->texco= 0;
ma->mapto= 0;
for(a=0; a<MAX_MTEX; a++) {
@@ -584,9 +573,6 @@ void init_render_material(Material *ma)
}
if(needuv) ma->texco |= NEED_UV;
- // optimize, render only checks for ray_mirror value */
- if((ma->mode & MA_RAYMIRROR)==0) ma->ray_mirror= 0.0;
-
// since the raytracer doesnt recalc O structs for each ray, we have to preset them all
if(ma->mode & (MA_RAYMIRROR|MA_RAYTRANSP|MA_SHADOW_TRA)) {
ma->texco |= NEED_UV|TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM;
@@ -613,10 +599,7 @@ void init_render_materials()
void end_render_material(Material *ma)
{
-
- if(ma->ren) MEM_freeN(ma->ren);
- ma->ren= 0;
-
+ /* XXXX obsolete? check! */
if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) {
if( !(ma->mode & MA_HALO) ) {
ma->r= ma->g= ma->b= 1.0;
@@ -748,8 +731,6 @@ void delete_material_index()
}
obt= obt->id.next;
}
- allqueue(REDRAWBUTSMAT, 0);
-
/* check indices from mesh */
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 7a751f2d720..dbca2b6ec4f 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -169,16 +169,15 @@ Scene *add_scene(char *name)
sce->r.framelen= 1.0;
sce->r.frs_sec= 25;
+ sce->r.postgamma= 1.0;
+ sce->r.posthue= 1.0;
+ sce->r.postmul= 1.0;
+
sce->r.xplay= 640;
sce->r.yplay= 480;
sce->r.freqplay= 60;
sce->r.depth= 32;
- if (sce->r.avicodecdata) {
-printf("this is not good\n");
- }
-// sce->r.imtype= R_TARGA;
-
sce->r.stereomode = 1; // no stereo
strcpy(sce->r.backbuf, "//backbuf");
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index e25a8a7f13c..c5f26eeb19c 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -65,7 +65,6 @@
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
-#include "BKE_osa_types.h"
#include "BKE_plugin_types.h"
#include "BKE_bad_level_calls.h"
@@ -82,8 +81,6 @@
#include "BKE_ipo.h"
-
-
/* ------------------------------------------------------------------------- */
/* All support for plugin textures: */
@@ -241,14 +238,11 @@ ColorBand *add_colorband()
int do_colorband(ColorBand *coba, float in, float out[4])
{
- /* These vars form the texture channel, in render/intern/texture.c */
- extern int Talpha;
CBData *cbd1, *cbd2, *cbd0, *cbd3;
float fac, mfac, t[4];
int a;
if(coba->tot==0) return 0;
- Talpha= 1;
cbd1= coba->data;
if(coba->tot==1) {
diff --git a/source/blender/blenlib/BLI_arithb.h b/source/blender/blenlib/BLI_arithb.h
index 77081f99246..abb5a2757dc 100644
--- a/source/blender/blenlib/BLI_arithb.h
+++ b/source/blender/blenlib/BLI_arithb.h
@@ -783,6 +783,10 @@ Vec2Addf(
float *v2
);
+void tubemap(float x, float y, float z, float *u, float *v);
+void spheremap(float x, float y, float z, float *u, float *v);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c
index f73005dcd9b..c4dd5de3a0e 100644
--- a/source/blender/blenlib/intern/arithb.c
+++ b/source/blender/blenlib/intern/arithb.c
@@ -2492,3 +2492,38 @@ void cpack_to_rgb(unsigned int col, float *r, float *g, float *b)
*b= (float)(((col)>>16)&0xFF);
*b /= 255.0f;
}
+
+
+/* *************** PROJECTIONS ******************* */
+
+void tubemap(float x, float y, float z, float *u, float *v)
+{
+ float len;
+
+ *v = (z + 1.0) / 2.0;
+
+ len= sqrt(x*x+y*y);
+ if(len>0) {
+ *u = (1.0 - (atan2(x/len,y/len) / M_PI)) / 2.0;
+ }
+}
+
+/* ------------------------------------------------------------------------- */
+
+void spheremap(float x, float y, float z, float *u, float *v)
+{
+ float len;
+
+ len= sqrt(x*x+y*y+z*z);
+ if(len>0.0) {
+
+ if(x==0.0 && y==0.0) *u= 0.0; /* othwise domain error */
+ else *u = (1.0 - atan2(x,y)/M_PI )/2.0;
+
+ z/=len;
+ *v = 1.0- saacos(z)/M_PI;
+ }
+}
+
+/* ------------------------------------------------------------------------- */
+
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 5e4bdd3ed7c..9efdb1f90f3 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -106,32 +106,34 @@
#include "BKE_bad_level_calls.h" // for reopen_text build_seqar (from WHILE_SEQ) open_plugin_seq set_rects_butspace check_imasel_copy
+#include "BKE_armature.h" // for precalc_bonelist_irestmats
+#include "BKE_action.h"
#include "BKE_constraint.h"
-#include "BKE_utildefines.h" // SWITCH_INT WHILE_SEQ END_SEQ DATA ENDB DNA1 O_BINARY GLOB USER TEST REND
-#include "BKE_main.h" // for Main
+#include "BKE_curve.h"
+#include "BKE_effect.h" // for give_parteff
#include "BKE_global.h" // for G
#include "BKE_property.h" // for get_property
#include "BKE_library.h" // for wich_libbase
-#include "BKE_texture.h" // for open_plugin_tex
-#include "BKE_effect.h" // for give_parteff
-#include "BKE_sca.h" // for init_actuator
+#include "BKE_main.h" // for Main
#include "BKE_mesh.h" // for ME_ defines (patching)
-#include "BKE_armature.h" // for precalc_bonelist_irestmats
-#include "BKE_action.h"
#include "BKE_object.h"
+#include "BKE_sca.h" // for init_actuator
#include "BKE_scene.h"
+#include "BKE_texture.h" // for open_plugin_tex
+#include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND
#include "BIF_butspace.h" // for do_versions, patching event codes
#include "BLO_readfile.h"
#include "BLO_undofile.h"
+#include "BLO_readblenfile.h" // streaming read pipe, for BLO_readblenfile BLO_readblenfilememory
+
#include "readfile.h"
#include "genfile.h"
-#include "BLO_readblenfile.h" // streaming read pipe, for BLO_readblenfile BLO_readblenfilememory
-
#include "mydevice.h"
+#include "blendef.h"
/*
Remark: still a weak point is the newadress() function, that doesnt solve reading from
@@ -2012,7 +2014,6 @@ static void direct_link_material(FileData *fd, Material *ma)
ma->ramp_col= newdataadr(fd, ma->ramp_col);
ma->ramp_spec= newdataadr(fd, ma->ramp_spec);
- ma->ren= NULL; /* should not be needed, nevertheless... */
}
/* ************ READ MESH ***************** */
@@ -4594,11 +4595,24 @@ static void do_versions(Main *main)
}
if(main->versionfile <= 235) {
Tex *tex= main->tex.first;
+ Scene *sce= main->scene.first;
while(tex) {
if(tex->nabla==0.0) tex->nabla= 0.025;
tex= tex->id.next;
}
+ while(sce) {
+ sce->r.postsat= 1.0;
+ sce= sce->id.next;
+ }
+ }
+ if(main->versionfile <= 236) {
+ Scene *sce= main->scene.first;
+
+ while(sce) {
+ if(sce->r.postsat==0.0) sce->r.postsat= 1.0;
+ sce= sce->id.next;
+ }
}
/* don't forget to set version number in blender.c! */
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 7fc8ac914e4..3232f12f13e 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -144,15 +144,17 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include "BLI_linklist.h"
#include "BKE_action.h"
-#include "BKE_utildefines.h" // for KNOTSU KNOTSV WHILE_SEQ END_SEQ defines
#include "BKE_bad_level_calls.h" // build_seqar (from WHILE_SEQ) free_oops error
+#include "BKE_curve.h"
#include "BKE_constraint.h"
-#include "BKE_main.h" // G.main
#include "BKE_global.h" // for G
-#include "BKE_screen.h" // for waitcursor
-#include "BKE_packedFile.h" // for packAll
#include "BKE_library.h" // for set_listbasepointers
+#include "BKE_main.h" // G.main
+#include "BKE_packedFile.h" // for packAll
+#include "BKE_screen.h" // for waitcursor
+#include "BKE_scene.h" // for do_seq
#include "BKE_sound.h" /* ... and for samples */
+#include "BKE_utildefines.h" // for defines
#include "GEN_messaging.h"
@@ -1494,8 +1496,8 @@ static void write_global(WriteData *wd)
fg.curscreen= G.curscreen;
fg.curscene= G.scene;
- fg.displaymode= R.displaymode;
- fg.winpos= R.winpos;
+ fg.displaymode= G.displaymode;
+ fg.winpos= G.winpos;
fg.fileflags= (G.fileflags & ~G_FILE_NO_UI); // prevent to save this, is not good convention, and feature with concerns...
fg.globalf= G.f;
diff --git a/source/blender/include/BIF_meshtools.h b/source/blender/include/BIF_meshtools.h
index facfecb0c6e..b82a1ab7133 100644
--- a/source/blender/include/BIF_meshtools.h
+++ b/source/blender/include/BIF_meshtools.h
@@ -34,7 +34,6 @@
#define BIF_MESHTOOLS_H
extern void join_mesh(void);
-extern void make_sticky(void);
extern void fasterdraw(void);
extern void slowerdraw(void);
diff --git a/source/blender/include/BIF_renderwin.h b/source/blender/include/BIF_renderwin.h
index efc13950bd6..6b607b110d6 100644
--- a/source/blender/include/BIF_renderwin.h
+++ b/source/blender/include/BIF_renderwin.h
@@ -46,6 +46,7 @@ void BIF_do_ogl_render(struct View3D *v3d, int anim);
void BIF_renderwin_set_for_ogl_render(void);
void BIF_renderwin_set_custom_cursor(unsigned char mask[16][2], unsigned char bitmap[16][2]);
+void BIF_redraw_render_rect(void);
void BIF_swap_render_rects(void);
void BIF_toggle_render_display(void);
diff --git a/source/blender/include/BSE_sequence.h b/source/blender/include/BSE_sequence.h
index 219b9cb1c7c..994559e6194 100644
--- a/source/blender/include/BSE_sequence.h
+++ b/source/blender/include/BSE_sequence.h
@@ -34,6 +34,7 @@
#ifndef BSE_SEQUENCE_H
#define BSE_SEQUENCE_H
+
struct PluginSeq;
struct StripElem;
struct Strip;
diff --git a/source/blender/include/blendef.h b/source/blender/include/blendef.h
index 1f627234216..d4d2b2eba9b 100644
--- a/source/blender/include/blendef.h
+++ b/source/blender/include/blendef.h
@@ -31,12 +31,6 @@
#ifndef BLENDEF_H
#define BLENDEF_H
-#ifdef WIN32
-#else
-#ifndef __BeOS
-#define O_BINARY 0
-#endif
-#endif
/* **************** MAX ********************* */
@@ -53,46 +47,19 @@
#define MAXFLOAT ((float)3.40282347e+38)
#endif
-#include <float.h>
-
-
-
-
-/* **************** GENERAL ********************* */
-
-#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
-#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
-
-#define VECADD(v1,v2,v3) {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
-#define VECSUB(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
+/* also fill in structs itself, dna cannot handle defines, duplicate with utildefines.h still */
+#ifndef FILE_MAXDIR
+#define FILE_MAXDIR 160
+#define FILE_MAXFILE 80
+#endif
-#define INPR(v1, v2) ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
-#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
-#define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
-#define CLAMPTEST(a, b, c) if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
-#define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
+#include <float.h>
-#define INIT_MINMAX(min, max) (min)[0]= (min)[1]= (min)[2]= 1.0e30; (max)[0]= (max)[1]= (max)[2]= -1.0e30;
-#define DO_MINMAX(vec, min, max) if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
- if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
- if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
- if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
- if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
- if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; \
-#define DO_MINMAX2(vec, min, max) if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
- if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
- if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
- if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1];
-#define MINSIZE(val, size) ( ((val)>=0.0) ? (((val)<(size)) ? (size): (val)) : ( ((val)>(-size)) ? (-size) : (val)))
-#define BTST(a,b) ( ( (a) & 1<<(b) )!=0 )
-#define BCLR(a,b) ( (a) & ~(1<<(b)) )
-#define BSET(a,b) ( (a) | 1<<(b) )
-/* bit-row */
-#define BROW(min, max) (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
+/* **************** GENERAL ********************* */
// return values
@@ -102,8 +69,6 @@
#define RET_YES (1 == 1)
#define RET_NO (1 == 0)
-#define LONGCOPY(a, b, c) {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
-
#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__)
/* big endian */
#define MAKE_ID2(c, d) ( (c)<<8 | (d) )
@@ -140,9 +105,6 @@
#define ISPOIN4(a, b, c, d, e) ( (a->b) && (a->c) && (a->d) && (a->e) )
-#define KNOTSU(nu) ( (nu)->orderu+ (nu)->pntsu+ (nu->orderu-1)*((nu)->flagu & 1) )
-#define KNOTSV(nu) ( (nu)->orderv+ (nu)->pntsv+ (nu->orderv-1)*((nu)->flagv & 1) )
-
/* psfont */
#define FNT_PDRAW 1
#define FNT_HAEBERLI 2
@@ -397,64 +359,9 @@
#define B_PERCENTSUBD 0x40
-/* ***************** DISPLIST ***************** */
-
-#define DL_POLY 0
-#define DL_SEGM 1
-#define DL_SURF 2
-#define DL_TRIA 3
-#define DL_INDEX3 4
-#define DL_INDEX4 5
-#define DL_VERTCOL 6
-#define DL_VERTS 7
-#define DL_NORS 8
-
-#define DL_SURFINDEX(cyclu, cyclv, sizeu, sizev) \
- \
- if( (cyclv)==0 && a==(sizev)-1) break; \
- if(cyclu) { \
- p1= sizeu*a; \
- p2= p1+ sizeu-1; \
- p3= p1+ sizeu; \
- p4= p2+ sizeu; \
- b= 0; \
- } \
- else { \
- p2= sizeu*a; \
- p1= p2+1; \
- p4= p2+ sizeu; \
- p3= p1+ sizeu; \
- b= 1; \
- } \
- if( (cyclv) && a==sizev-1) { \
- p3-= sizeu*sizev; \
- p4-= sizeu*sizev; \
- }
-
/* DISPLAYMODE */
#define R_DISPLAYVIEW 0
#define R_DISPLAYWIN 1
#define R_DISPLAYAUTO 2
-
-
-#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__)
-#define RCOMP 3
-#define GCOMP 2
-#define BCOMP 1
-#define ACOMP 0
-
-#else
-
-#define RCOMP 0
-#define GCOMP 1
-#define BCOMP 2
-#define ACOMP 3
-#endif
-
-#ifdef GS
-#undef GS
-#endif
-#define GS(a) (*((short *)(a)))
-
#endif
diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h
index 06326142c64..9bbc63f729d 100644
--- a/source/blender/include/butspace.h
+++ b/source/blender/include/butspace.h
@@ -274,6 +274,7 @@ void test_idbutton_cb(void *namev, void *arg2_unused);
#define B_SELECTCODEC 1639
#define B_RTCHANGED 1640
#define B_SWITCHRENDER 1641
+#define B_FBUF_REDO 1642
#ifdef __NLA
/* *********************** */
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index fa2447a12f4..b5adabbdc15 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -93,7 +93,6 @@ typedef struct Material {
struct MTex *mtex[10];
struct Ipo *ipo;
- struct Material *ren;
/* dynamic properties */
float friction, fh, reflect;
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 36dbd75d741..04aa96c9d1f 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -178,6 +178,8 @@ typedef struct RenderData {
* 14: motion blur
* 15: use unified renderer for this pic
* 16: enable raytracing
+ * 17: gauss sampling for subpixels
+ * 18: keep float buffer after render
*/
int mode;
@@ -208,9 +210,9 @@ typedef struct RenderData {
* The gamma for the normal rendering. Used when doing
* oversampling, to correctly blend subpixels to pixels. */
float gamma, gauss;
- /** post-production settings. Don't really belong here */
- float postmul, postgamma, postadd, postigamma;
-
+ /** post-production settings. */
+ float postmul, postgamma, postadd, postigamma, posthue, postsat;
+
/* Dither noise intensity */
float dither_intensity;
float pad_dither;
@@ -298,6 +300,8 @@ typedef struct Scene {
#define R_UNIFIED 0x8000
#define R_RAYTRACE 0x10000
#define R_GAUSS 0x20000
+#define R_FBUF 0x40000
+#define R_THREADS 0x80000
/* yafray: renderer flag (not only exclusive to yafray) */
#define R_INTERN 0
@@ -347,6 +351,7 @@ typedef struct Scene {
#define R_LAMPHALO 8
#define R_RENDERING 16
#define R_ANIMRENDER 32
+#define R_REDRAW_PRV 64
/* vlakren->flag (vlak = face in dutch) char!!! */
#define R_SMOOTH 1
diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h
index 634d9e887eb..cd6a0b8bbdb 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -151,7 +151,7 @@ typedef struct Tex {
short extend, len;
float checkerdist, nabla;
short frames, offset, sfra, fie_ima;
- float norfac, *nor;
+ float norfac;
struct Ipo *ipo;
struct Image *ima;
diff --git a/source/blender/python/api2_2x/sceneRender.c b/source/blender/python/api2_2x/sceneRender.c
index f90c8f0158a..bcfb495b238 100644
--- a/source/blender/python/api2_2x/sceneRender.c
+++ b/source/blender/python/api2_2x/sceneRender.c
@@ -44,7 +44,6 @@
#include <butspace.h>
#include <BKE_bad_level_calls.h>
#include "sceneRender.h"
-#include "render_types.h"
#include "blendef.h"
#include "Scene.h"
#include "gen_utils.h"
@@ -792,30 +791,30 @@ PyObject *M_Render_SetRenderWinPos( PyObject * self, PyObject * args )
return ( EXPP_ReturnPyObjError( PyExc_AttributeError,
"expected a list" ) );
- R.winpos = 0;
+ G.winpos = 0;
for( x = 0; x < PyList_Size( list ); x++ ) {
if( !PyArg_Parse( PyList_GetItem( list, x ), "s", &loc ) ) {
return EXPP_ReturnPyObjError( PyExc_TypeError,
"python list not parseable\n" );
}
if( strcmp( loc, "SW" ) == 0 || strcmp( loc, "sw" ) == 0 )
- R.winpos |= 1;
+ G.winpos |= 1;
else if( strcmp( loc, "S" ) == 0 || strcmp( loc, "s" ) == 0 )
- R.winpos |= 2;
+ G.winpos |= 2;
else if( strcmp( loc, "SE" ) == 0 || strcmp( loc, "se" ) == 0 )
- R.winpos |= 4;
+ G.winpos |= 4;
else if( strcmp( loc, "W" ) == 0 || strcmp( loc, "w" ) == 0 )
- R.winpos |= 8;
+ G.winpos |= 8;
else if( strcmp( loc, "C" ) == 0 || strcmp( loc, "c" ) == 0 )
- R.winpos |= 16;
+ G.winpos |= 16;
else if( strcmp( loc, "E" ) == 0 || strcmp( loc, "e" ) == 0 )
- R.winpos |= 32;
+ G.winpos |= 32;
else if( strcmp( loc, "NW" ) == 0 || strcmp( loc, "nw" ) == 0 )
- R.winpos |= 64;
+ G.winpos |= 64;
else if( strcmp( loc, "N" ) == 0 || strcmp( loc, "n" ) == 0 )
- R.winpos |= 128;
+ G.winpos |= 128;
else if( strcmp( loc, "NE" ) == 0 || strcmp( loc, "ne" ) == 0 )
- R.winpos |= 256;
+ G.winpos |= 256;
else
return EXPP_ReturnPyObjError( PyExc_AttributeError,
"list contains unknown string\n" );
@@ -828,7 +827,7 @@ PyObject *M_Render_SetRenderWinPos( PyObject * self, PyObject * args )
//------------------------------------Render.EnableDispView() -----------
PyObject *M_Render_EnableDispView( PyObject * self )
{
- R.displaymode = R_DISPLAYVIEW;
+ G.displaymode = R_DISPLAYVIEW;
allqueue( REDRAWBUTSSCENE, 0 );
return EXPP_incr_ret( Py_None );
@@ -837,7 +836,7 @@ PyObject *M_Render_EnableDispView( PyObject * self )
//------------------------------------Render.EnableDispWin() ------------
PyObject *M_Render_EnableDispWin( PyObject * self )
{
- R.displaymode = R_DISPLAYWIN;
+ G.displaymode = R_DISPLAYWIN;
allqueue( REDRAWBUTSSCENE, 0 );
return EXPP_incr_ret( Py_None );
@@ -919,14 +918,14 @@ PyObject *RenderData_Play( BPy_RenderData * self )
}
}
if( BLI_exist( file ) ) {
- calc_renderwin_rectangle( R.winpos, pos, size );
+ calc_renderwin_rectangle( G.winpos, pos, size );
sprintf( str, "%s -a -p %d %d \"%s\"", bprogname, pos[0],
pos[1], file );
system( str );
} else {
makepicstring( file, self->renderContext->sfra );
if( BLI_exist( file ) ) {
- calc_renderwin_rectangle( R.winpos, pos, size );
+ calc_renderwin_rectangle( G.winpos, pos, size );
sprintf( str, "%s -a -p %d %d \"%s\"", bprogname,
pos[0], pos[1], file );
system( str );
diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript
index e4c4f7edf13..b7761cd97d4 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -1,6 +1,7 @@
#!/usr/bin/python
Import ('user_options_dict')
Import ('library_env')
+Import ('sdl_env')
render_env = library_env.Copy ()
@@ -9,6 +10,7 @@ source_files = ['intern/source/RE_callbacks.c',
'intern/source/envmap.c',
'intern/source/errorHandler.c',
'intern/source/gammaCorrectionTables.c',
+ 'intern/source/imagetexture.c',
'intern/source/initrender.c',
'intern/source/jitter.c',
'intern/source/pixelblending.c',
@@ -36,6 +38,7 @@ render_env.Append (CPPPATH = ['intern/include',
'../quicktime',
'../include',
'../../kernel/gen_messaging',
- '../yafray'])
+ '../yafray'] +
+ sdl_env['CPPPATH'])
render_env.Library (target='#'+user_options_dict['BUILD_DIR']+'/lib/blender_render', source=source_files)
diff --git a/source/blender/render/extern/include/render.h b/source/blender/render/extern/include/render.h
index d3953204678..209cf52b250 100644
--- a/source/blender/render/extern/include/render.h
+++ b/source/blender/render/extern/include/render.h
@@ -40,9 +40,6 @@
/* fixes. I think it is risky to always include it... */
/* ------------------------------------------------------------------------- */
-/* fix for OSA and defmaterial extern */
-#include "BKE_osa_types.h"
-#include "DNA_material_types.h"
#ifdef __cplusplus
extern "C" {
@@ -69,8 +66,6 @@ extern "C" {
/* ------------------------------------------------------------------------- */
extern RE_Render R; /* rendercore.c */
-extern Osa O; /* rendercore.c */
-extern Material defmaterial; /* initrender.c */
extern unsigned short *igamtab1; /* initrender.c */
extern unsigned short *gamtab; /* initrender.c */
@@ -80,7 +75,7 @@ struct View3D;
/* Function definitions */
/* */
/* All functions that need to be externally visible must be declared here. */
-/* Currently, this interface contains 29 functions and 11 callbacks. */
+/* Currently, this interface contains 38 functions and 11 callbacks. */
/* ------------------------------------------------------------------------- */
@@ -88,11 +83,12 @@ struct View3D;
/* shadbuf.c (1) */
/* ------------------------------------------------------------------------- */
+/* only for renderconvertor */
void RE_initshadowbuf(struct LampRen *lar, float mat[][4]);
/* ------------------------------------------------------------------------- */
-/* initrender (14) */
+/* initrender (9) */
/* ------------------------------------------------------------------------- */
struct View3D;
@@ -107,7 +103,7 @@ struct View3D;
void RE_initrender(struct View3D *ogl_render_view3d);
/**
- *
+ * only for renderconvertor
*/
void RE_setwindowclip(int mode, int jmode);
@@ -117,12 +113,12 @@ void RE_setwindowclip(int mode, int jmode);
*/
void RE_animrender(struct View3D *ogl_render_view3d);
void RE_free_render_data(void);
-void RE_free_filt_mask(void);
-void RE_init_filt_mask(void);
void RE_init_render_data(void);
+ /* jitterate is used by blenkernel effect */
void RE_jitterate1(float *jit1, float *jit2, int num, float rad1);
void RE_jitterate2(float *jit1, float *jit2, int num, float rad2);
void RE_make_existing_file(char *name);
+void RE_floatbuffer_to_output(void);
/* ------------------------------------------------------------------------- */
/* zbuf (2) */
@@ -151,7 +147,7 @@ void RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_t
/* ------------------------------------------------------------------------- */
-/* texture */
+/* texture (9) */
/* ------------------------------------------------------------------------- */
struct MTex;
struct Tex;
@@ -161,17 +157,11 @@ void end_render_textures(void);
void init_render_texture(struct Tex *tex);
void end_render_texture(struct Tex *tex);
-void tubemap(float x, float y, float z, float *adr1, float *adr2);
-void spheremap(float x, float y, float z, float *adr1, float *adr2);
-
void do_material_tex(ShadeInput *shi);
-void externtex(struct MTex *mtex, float *vec);
-void externtexcol(struct MTex *mtex, float *orco, char *col);
-void do_lamp_tex(struct LampRen *la, float *lavec, ShadeInput *shi);
-void do_sky_tex(float *);
-
-int multitex(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex);
+void do_lamp_tex(struct LampRen *la, float *lavec, ShadeInput *shi, float *fcol);
+int multitex_ext(struct Tex *tex, float *texvec, float *tin, float *tr, float *tg, float *tb, float *ta);
+void externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta);
/* ------------------------------------------------------------------------- */
/* envmap (4) */
@@ -186,7 +176,7 @@ struct EnvMap *RE_add_envmap(void);
struct EnvMap *RE_copy_envmap(struct EnvMap *env);
/* --------------------------------------------------------------------- */
-/* rendercore (2) */
+/* rendercore (10) */
/* --------------------------------------------------------------------- */
float Phong_Spec(float *n, float *l, float *v, int hard);
float CookTorr_Spec(float *n, float *l, float *v, int hard);
@@ -206,9 +196,8 @@ void ramp_spec_result(float *specr, float *specg, float *specb, ShadeInput *shi)
struct VlakRen *RE_findOrAddVlak(int nr);
struct VertRen *RE_findOrAddVert(int nr);
struct HaloRen *RE_findOrAddHalo(int nr);
-HaloRen *RE_inithalo(Material *ma, float *vec, float *vec1, float *orco, float hasize,
- float vectsize);
-
+HaloRen *RE_inithalo(struct Material *ma, float *vec, float *vec1, float *orco, float hasize,
+ float vectsize, int seed);
/**
* callbacks (11):
@@ -255,13 +244,13 @@ int RE_testclip(float *v);
/* patch for the external if, to support the split for the ui */
void RE_addalphaAddfac(char *doel, char *bron, char addfac);
void RE_sky_char(float *view, char *col);
-void RE_sky(float *view, float *col);
void RE_renderflare(struct HaloRen *har);
/**
* Shade the pixel at xn, yn for halo har, and write the result to col.
* Also called in: previewrender.c
* @param har The halo to be rendered on this location
- * @param col [unsigned int 3] The destination colour vector
+ * @param col [char 4] The destination colour vector
+ * @param colf [float 4] destination colour vector (need both)
* @param zz Some kind of distance
* @param dist Square of the distance of this coordinate to the halo's center
* @param x [f] Pixel x relative to center
@@ -269,7 +258,7 @@ void RE_renderflare(struct HaloRen *har);
* @param flarec Flare counter? Always har->flarec...
*/
void RE_shadehalo(struct HaloRen *har,
- char *col,
+ char *col, float *colf,
unsigned int zz,
float dist,
float x,
diff --git a/source/blender/render/extern/include/render_types.h b/source/blender/render/extern/include/render_types.h
index 9f1fb9efef2..f8826228535 100644
--- a/source/blender/render/extern/include/render_types.h
+++ b/source/blender/render/extern/include/render_types.h
@@ -51,14 +51,48 @@
/* ------------------------------------------------------------------------- */
+/* localized texture result data */
+typedef struct TexResult {
+ float tin, tr, tg, tb, ta;
+ int talpha;
+ float *nor;
+} TexResult;
+
/* localized renderloop data */
typedef struct ShadeInput
{
- struct Material *mat, *matren;
+ struct Material *mat;
struct VlakRen *vlr;
float co[3];
+
+ /* copy from material, keep synced so we can do memcopy */
+ /* current size: 23*4 */
+ float r, g, b;
+ float specr, specg, specb;
+ float mirr, mirg, mirb;
+ float ambr, ambb, ambg;
+
+ float amb, emit, ang, spectra, ray_mirror;
+ float alpha, refl, spec, zoffs, add;
+ float translucency;
+ /* end direct copy from material */
+
+ /* individual copies: */
+ int har;
+
+ /* texture coordinates */
float lo[3], gl[3], uv[3], ref[3], orn[3], winco[3], sticky[3], vcol[3], rad[3];
float vn[3], view[3], refcol[4], displace[3];
+ /* dx/dy OSA coordinates */
+ float dxco[3], dyco[3];
+ float dxlo[3], dylo[3], dxgl[3], dygl[3], dxuv[3], dyuv[3];
+ float dxref[3], dyref[3], dxorn[3], dyorn[3];
+ float dxno[3], dyno[3], dxview, dyview;
+ float dxlv[3], dylv[3];
+ float dxwin[3], dywin[3];
+ float dxsticky[3], dysticky[3];
+ float dxrefract[3], dyrefract[3];
+
float xs, ys; /* pixel to be rendered */
short osatex;
int mask;
@@ -69,7 +103,7 @@ typedef struct ShadeInput
/* here only stuff to initalize the render itself */
typedef struct RE_Render
{
- float grvec[3], inprz, inprh;
+ float grvec[3];
float imat[3][3];
float viewmat[4][4], viewinv[4][4];
@@ -113,6 +147,7 @@ typedef struct RE_Render
unsigned int *rectspare; /* */
/* for 8 byte systems! */
long *rectdaps;
+ float *rectftot; /* original full color buffer */
short win, winpos, winx, winy, winxof, winyof;
short winpop, displaymode, sparex, sparey;
@@ -125,17 +160,6 @@ typedef struct RE_Render
/* ------------------------------------------------------------------------- */
-/**
- * Part as in part-rendering. An image rendered in parts is rendered
- * to a list of parts, with x,y size, and a pointer to the render
- * output stored per part. Internal!
- */
-typedef struct Part
-{
- struct Part *next, *prev;
- unsigned int *rect;
- short x, y;
-} Part;
typedef struct ShadBuf {
short samp, shadhalostep;
@@ -186,14 +210,14 @@ typedef struct RadFace {
typedef struct VlakRen
{
struct VertRen *v1, *v2, *v3, *v4;
+ unsigned int lay;
+ unsigned int raycount;
float n[3];
struct Material *mat;
struct TFace *tface;
unsigned int *vcol;
char snproj, puno;
char flag, ec;
- unsigned int lay;
- unsigned int raycount;
RadFace *radface;
Object *ob;
} VlakRen;
@@ -202,12 +226,12 @@ typedef struct VlakRen
typedef struct HaloRen
{
+ short miny, maxy;
float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3];
+ float hard, b, g, r;
unsigned int zs, zd;
- unsigned int zBufDist;/* depth in the z-buffer coordinate system */
- short miny, maxy;
- short hard, b, g, r;
- char starpoints, add, type, tex;
+ unsigned int zBufDist; /* depth in the z-buffer coordinate system */
+ char starpoints, type, add, tex;
char linec, ringc, seed;
short flarec; /* used to be a char. why ?*/
float hasize;
@@ -274,9 +298,9 @@ typedef struct LampRen
/* ray optim */
VlakRen *vlr_last;
- struct LampRen *org;
struct MTex *mtex[MAX_MTEX];
} LampRen;
+
#endif /* RENDER_TYPES_H */
diff --git a/source/blender/render/intern/include/envmap.h b/source/blender/render/intern/include/envmap.h
index c77bb01f6ac..7a44a139b20 100644
--- a/source/blender/render/intern/include/envmap.h
+++ b/source/blender/render/intern/include/envmap.h
@@ -40,8 +40,11 @@
* environment map as texture.
* (initrender.c)
*/
+
+struct TexResult;
+
void make_envmaps(void);
-int envmaptex(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex);
+int envmaptex(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres);
#endif /* ENVMAP_EXT_H */
diff --git a/source/blender/render/intern/include/gammaCorrectionTables.h b/source/blender/render/intern/include/gammaCorrectionTables.h
index 8df743e468d..6197f769f6f 100644
--- a/source/blender/render/intern/include/gammaCorrectionTables.h
+++ b/source/blender/render/intern/include/gammaCorrectionTables.h
@@ -67,12 +67,7 @@ float invGammaCorrect(float col);
/**
* Tell whether or not to do gamma.
*/
-int doGamma(void);
-
-/**
- * Set/unset performing gamma corrections.
- */
-void setDoGamma(int);
+extern int do_gamma;
#endif
diff --git a/source/blender/render/intern/include/initrender.h b/source/blender/render/intern/include/initrender.h
index 06c5f032c7d..15ec3eb69a3 100644
--- a/source/blender/render/intern/include/initrender.h
+++ b/source/blender/render/intern/include/initrender.h
@@ -42,16 +42,7 @@
/* Functions */
-void init_def_material(void);
-void init_render_jit(int nr);
-float calc_weight(float *weight, int i, int j);
-void defaultlamp(void);
void schrijfplaatje(char *name);
-void initparts(void);
-short setpart(short nr); /* return 0 als geen goede part */
-void addparttorect(short nr, Part *part);
-void add_to_blurbuf(int blur);
-void oldRenderLoop(void); /* Calls the old renderer. Contains the PART and FIELD loops. */
void render(void); /* Switch between the old and the unified renderer. */
/* void write_screendump(char *name); not here !*/
diff --git a/source/blender/render/intern/include/jitter.h b/source/blender/render/intern/include/jitter.h
index f270207cc22..696ded297b1 100644
--- a/source/blender/render/intern/include/jitter.h
+++ b/source/blender/render/intern/include/jitter.h
@@ -41,7 +41,8 @@ extern "C" {
extern float jit[64][2];
-void initjit(float *jitarr, int num);
+extern void initjit(float *jitarr, int num);
+extern void init_render_jit(int nr);
#ifdef __cplusplus
}
diff --git a/source/blender/render/intern/include/old_zbuffer_types.h b/source/blender/render/intern/include/old_zbuffer_types.h
deleted file mode 100644
index 4adf5f047ba..00000000000
--- a/source/blender/render/intern/include/old_zbuffer_types.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * 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.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- * Datatypes for old zbuffering algorithms.
- */
-
-#ifndef OLD_ZBUFFER_TYPES_H
-#define OLD_ZBUFFER_TYPES_H "$Id$"
-
-typedef struct PixStr
-{
- struct PixStr *next;
- int vlak0, vlak;
- unsigned int z;
- unsigned int mask;
- short aantal, ronde;
-} PixStr;
-
-/* ------------------------------------------------------------------------- */
-
-typedef struct PixStrMain
-{
- struct PixStr *ps;
- struct PixStrMain *next;
-} PixStrMain;
-
-/* ------------------------------------------------------------------------- */
-
-#endif
-
diff --git a/source/blender/render/intern/include/pixelblending.h b/source/blender/render/intern/include/pixelblending.h
index b413bc8b8a1..f5e96d075da 100644
--- a/source/blender/render/intern/include/pixelblending.h
+++ b/source/blender/render/intern/include/pixelblending.h
@@ -39,19 +39,6 @@
/* local includes */
#include "vanillaRenderPipe_types.h"
-/* own include */
-#include "pixelblending_types.h"
-
-/**
- * Samples pixel, depending on R.osa setting
- */
-int addtosampcol(unsigned short *sampcol, unsigned short *shortcol, int mask);
-
-/**
- * Samples pixel, bring your own R.osa setting
- */
-int addToSampCol(unsigned short *sampcol, unsigned short *shortcol, int mask, int osaNr);
-
/**
* Halo-add pixel, bring your own R.osa setting, and add factor
*/
diff --git a/source/blender/render/intern/include/pixelblending_types.h b/source/blender/render/intern/include/pixelblending_types.h
deleted file mode 100644
index dac9924494f..00000000000
--- a/source/blender/render/intern/include/pixelblending_types.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * pixelblending_types.h
- * types pixelblending
- *
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * 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.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-#ifndef PIXELBLENDING_TYPES_H
-#define PIXELBLENDING_TYPES_H
-
-/* Threshold for a 'full' pixel: pixels with alpha above this level are */
-/* considered opaque This is the decimal value for 0xFFF0 / 0xFFFF */
-#define RE_FULL_COLOUR_FLOAT 0.9998
-/* Threshold for an 'empty' pixel: pixels with alpha above this level are */
-/* considered completely transparent. This is the decimal value */
-/* for 0x000F / 0xFFFF */
-#define RE_EMPTY_COLOUR_FLOAT 0.0002
-/* A 100% pixel. Sometimes, seems to be too little.... Hm....... */
-#define RE_UNITY_COLOUR_FLOAT 1.0
-/* A 0% pixel. I wonder how 0 the 0.0 is... */
-#define RE_ZERO_COLOUR_FLOAT 0.0
-
-/* threshold for alpha */
-#define RE_FULL_ALPHA_FLOAT 0.9998
-
-/* Same set of defines for shorts */
-#define RE_FULL_COLOUR_SHORT 0xFFF0
-#define RE_EMPTY_COLOUR_SHORT 0x0000
-
-#endif /* PIXELBLENDING_EXT_H */
-
diff --git a/source/blender/render/intern/include/pixelshading.h b/source/blender/render/intern/include/pixelshading.h
index dd429f9ff61..2f888cf05cf 100644
--- a/source/blender/render/intern/include/pixelshading.h
+++ b/source/blender/render/intern/include/pixelshading.h
@@ -51,12 +51,13 @@
* mask is pixel coverage in bits
* @return pointer to the object
*/
-void *renderPixel(float x, float y, int *t, int mask);
+void *renderPixel(RE_COLBUFTYPE *collector, float x, float y, int *t, int mask);
-void *renderHaloPixel(float x, float y, int haloNr) ;
+void *renderHaloPixel(RE_COLBUFTYPE *collector, float x, float y, int haloNr) ;
void setSkyBlendingMode(enum RE_SkyAlphaBlendingType mode);
+
void shadeHaloFloat(HaloRen *har,
float *col, unsigned int zz,
float dist, float xn,
@@ -69,13 +70,14 @@ enum RE_SkyAlphaBlendingType getSkyBlendingMode(void);
/**
* Render the sky at pixel (x, y).
*/
-void renderSkyPixelFloat(float x, float y);
+void renderSkyPixelFloat(RE_COLBUFTYPE *collector, float x, float y);
/* used by shadeSkyPixel: */
-void shadeSkyPixelFloat(float y, float *view);
+void shadeSkyPixelFloat(float *colf, float *view, float *dxyview);
void renderSpotHaloPixel(float x, float y, float *target);
-void shadeSkyPixel(float fx, float fy);
-void fillBackgroundImage(float x, float y);
+void shadeSkyPixel(RE_COLBUFTYPE *collector, float fx, float fy);
+void fillBackgroundImage(RE_COLBUFTYPE *collector, float x, float y);
+void fillBackgroundImageChar(char *col, float x, float y);
/* ------------------------------------------------------------------------- */
diff --git a/source/blender/render/intern/include/render_intern.h b/source/blender/render/intern/include/render_intern.h
deleted file mode 100644
index 25302ad97bd..00000000000
--- a/source/blender/render/intern/include/render_intern.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * render_int.h
- * misc internal defines for renderer
- *
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * 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.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
- /* XXX, should die, no good reason to write
- * regular (non-file related) endian dependant
- * code.
- */
-#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__)
-#define RCOMP 3
-#define GCOMP 2
-#define BCOMP 1
-#define ACOMP 0
-#else
-#define RCOMP 0
-#define GCOMP 1
-#define BCOMP 2
-#define ACOMP 3
-#endif
-
-#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
-#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
-
-#define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
-
-typedef struct {
- int a, b, c, d;
-} byte16;
-
-#define COPY_16(a,b) (*((byte16 *)(a))= *((byte16 *)(b)))
-
diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h
index 964300ad27b..e66e405d383 100644
--- a/source/blender/render/intern/include/rendercore.h
+++ b/source/blender/render/intern/include/rendercore.h
@@ -54,20 +54,36 @@ typedef struct ShadeResult
} ShadeResult;
-float mistfactor(float *co); /* dist en hoogte, return alpha */
+typedef struct PixStr
+{
+ struct PixStr *next;
+ int vlak0, vlak;
+ unsigned int z;
+ unsigned int mask;
+ short aantal, ronde;
+} PixStr;
+
+/* ------------------------------------------------------------------------- */
+
+typedef struct PixStrMain
+{
+ struct PixStr *ps;
+ struct PixStrMain *next;
+} PixStrMain;
+
+
+float mistfactor(float *co); /* dist and height, return alpha */
-void render_lighting_halo(struct HaloRen *har, float *colf);
-unsigned int calchalo_z(struct HaloRen *har, unsigned int zz);
-void add_halo_flare(void);
+void add_halo_flare(void);
-void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, int i3);
+void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, int i3);
-void shade_color(struct ShadeInput *shi, ShadeResult *shr);
-void shade_lamp_loop(struct ShadeInput *shi, ShadeResult *shr);
+void shade_color(struct ShadeInput *shi, ShadeResult *shr);
+void shade_lamp_loop(struct ShadeInput *shi, ShadeResult *shr);
-float fresnel_fac(float *view, float *vn, float fresnel, float fac);
-void calc_R_ref(struct ShadeInput *shi);
-float spec(float inp, int hard);
+float fresnel_fac(float *view, float *vn, float fresnel, float fac);
+void calc_R_ref(struct ShadeInput *shi);
+float spec(float inp, int hard);
/* -------- ray.c ------- */
@@ -76,36 +92,12 @@ extern void ray_trace(ShadeInput *, ShadeResult *);
extern void ray_ao(ShadeInput *, World *, float *);
/**
- * Apply the background (sky). Depending on the active alphamode and
- * worldmode, different filling strategies are applied.
- * Active alphamode = R.r.alphamode
- * Active worldmode = R.wrld.mode
- * <LI>
- * <IT> R_ALPHAPREMUL - do not fill sky, but apply alpha to colours
- * <IT> R_ALPHAKEY - do not fill sky, do not apply alpha to colours
- * <IT> R_ADDSKY - fill skycolour in the background, blend
- * transparent colours with the background
- * (there's also a world dependency here?
- * <LI>
- * <IT> R.wrld.mode == WO_MIST
- * <IT> R.r.bufflag == 1, R.flag == R_SEC_FIELD
- * <IT> R.wrld.skytype == ( WO_SKYBLEND ^ WO_SKYTEX)
- * <IT> R.wrld.skytype == WO_SKYPAPER
- * <IT> R.r.mode == R_PANORAMA )
- * </LI>
- * </LI>
- * @param rect
- * @param y
- */
-void scanlinesky(char *rect, int y);
-
-/**
- * Do z buffer stuff.
+ * Do z buffer and shade
*/
void zbufshade(void);
/**
- * Insert transparent faces into the z buffer?
+ * zbuffer and shade, anti aliased
*/
void zbufshadeDA(void); /* Delta Accum Pixel Struct */
@@ -113,20 +105,6 @@ void zbufshadeDA(void); /* Delta Accum Pixel Struct */
* Also called in: zbuf.c
*/
void *shadepixel(float x, float y, int vlaknr, int mask, float *col);
-void shadepixel_short(float x, float y, int vlaknr, int mask, unsigned short *shortcol);
-
-/**
- * Shade the pixel at xn, yn for halo har, and write the result to col.
- * Also called in: previewrender.c
- * @param har The halo to be rendered on this location
- * @param col [unsigned int 3] The destination colour vector
- * @param zz Some kind of distance
- * @param dist Square of the distance of this coordinate to the halo's center
- * @param x [f] Pixel x relative to center
- * @param y [f] Pixel y relative to center
- * @param flarec Flare counter? Always har->flarec...
- */
-/* void shadehalo(struct HaloRen *har, char *col, unsigned int zz, float dist, float x, float y, short flarec); */
/**
* A cryptic but very efficient way of counting the number of bits that
diff --git a/source/blender/render/intern/include/rendercore_int.h b/source/blender/render/intern/include/rendercore_int.h
deleted file mode 100644
index 6b6ae899a8d..00000000000
--- a/source/blender/render/intern/include/rendercore_int.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * render_int.h
- *
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * 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.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-#ifndef RENDER_INT_H
-#define RENDER_INT_H
-
-#include "zbuf_types.h"
-#include "render_types.h"
-
-void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens);
-void add_filt_mask(unsigned int mask, unsigned short *col, unsigned int *rb1, unsigned int *rb2, unsigned int *rb3);
-void addps(long *rd, int vlak, unsigned int z, short ronde);
-PixStr *addpsmain(void);
-float count_maskf(unsigned short mask);
-void freeps(void);
-void halovert(void);
-void renderhalo(HaloRen *har); /* postprocess versie */
-void scanlinehaloPS(unsigned int *rectz, long *rectdelta, unsigned int *rectt, short ys);
-
-#endif /* RENDER_INT_H */
-
diff --git a/source/blender/render/intern/include/shadbuf.h b/source/blender/render/intern/include/shadbuf.h
index f0bdcd224b6..279d5319b21 100644
--- a/source/blender/render/intern/include/shadbuf.h
+++ b/source/blender/render/intern/include/shadbuf.h
@@ -52,7 +52,7 @@ void makeshadowbuf(LampRen *lar);
* @param inp The inproduct between viewvector and ?
*
*/
-float testshadowbuf(struct ShadBuf *shb, float *rco, float inp);
+float testshadowbuf(struct ShadBuf *shb, float *rco, float *dxco, float *dyco, float inp);
/**
* Determines the shadow factor for lamp <lar>, between <p1>
diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h
index 9932f5a60ea..866f631dac6 100644
--- a/source/blender/render/intern/include/texture.h
+++ b/source/blender/render/intern/include/texture.h
@@ -35,12 +35,32 @@
#ifndef TEXTURE_EXT_H
#define TEXTURE_EXT_H
+#define BRICONT texres->tin= (texres->tin-0.5)*tex->contrast+tex->bright-0.5; \
+if(texres->tin<0.0) texres->tin= 0.0; else if(texres->tin>1.0) texres->tin= 1.0;
+
+#define BRICONTRGB texres->tr= tex->rfac*((texres->tr-0.5)*tex->contrast+tex->bright-0.5); \
+if(texres->tr<0.0) texres->tr= 0.0; \
+texres->tg= tex->gfac*((texres->tg-0.5)*tex->contrast+tex->bright-0.5); \
+if(texres->tg<0.0) texres->tg= 0.0; \
+texres->tb= tex->bfac*((texres->tb-0.5)*tex->contrast+tex->bright-0.5); \
+if(texres->tb<0.0) texres->tb= 0.0;
+
+
struct HaloRen;
struct ShadeInput;
+struct TexResult;
+struct Tex;
+
+/* texture.h */
void do_halo_tex(struct HaloRen *har, float xn, float yn, float *colf);
+void do_sky_tex(float *lo, float *dxyview, float *hor, float *zen, float *blend);
void render_realtime_texture(struct ShadeInput *shi);
+/* imagetexture.h */
+
+int imagewraposa(struct Tex *tex, float *texvec, float *dxt, float *dyt, struct TexResult *texres);
+int imagewrap(struct Tex *tex, float *texvec, struct TexResult *texres);
#endif /* TEXTURE_EXT_H */
diff --git a/source/blender/render/intern/include/vanillaRenderPipe.h b/source/blender/render/intern/include/vanillaRenderPipe.h
index 1ace0c23610..f242b8522fc 100644
--- a/source/blender/render/intern/include/vanillaRenderPipe.h
+++ b/source/blender/render/intern/include/vanillaRenderPipe.h
@@ -45,5 +45,15 @@
*/
void zBufShadeAdvanced(void);
+/**
+ * Copy the colour buffer output to R.rectot, to line y.
+ */
+void transferColourBufferToOutput(float *buf, int y);
+/**
+ * using default transforms for brightness, gamma, hue, saturation etc.
+ */
+void std_floatcol_to_charcol(float *buf, char *target);
+
+
#endif /* VANILLARENDERPIPE_EXT_H */
diff --git a/source/blender/render/intern/include/vanillaRenderPipe_int.h b/source/blender/render/intern/include/vanillaRenderPipe_int.h
deleted file mode 100644
index 980befae66f..00000000000
--- a/source/blender/render/intern/include/vanillaRenderPipe_int.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * vanillaRenderPipe_int.h
- *
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * 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.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-#ifndef VANILLARENDERPIPE_INT_H
-#define VANILLARENDERPIPE_INT_H
-
-#include "vanillaRenderPipe_types.h"
-#include "zbufferdatastruct_types.h"
-
-/**
- * Z buffer initializer, for new pipeline.
- * <LI>
- * <IT> AColourBuffer : colour buffer for one line
- * <IT> APixbufExt : pixel data buffer for one line, depth RE_ZBUFLEN
- * </LI>
- */
-void initRenderBuffers(int width);
-/* void initRenderBuffers(void); */
-
-/**
- * Z buffer destructor, frees stuff from initZBuffers().
- */
-void freeRenderBuffers(void);
-
-/**
- * Fill the accumulation buffer APixbufExt with face and halo indices.
- * Note: Uses globals.
- * @param y the line number to set
- */
-void calcZBufLine(int y);
-
-/**
- * Shade and render the pixels in this line, into AColourBuffer
- * Note: Uses globals.
- * @param y the line number to set
- */
-void renderZBufLine(int y);
-
-/**
- * Count and sort the list behind ap into buf. Sorts on min. distance.
- * Low index <=> high z
- */
-int countAndSortPixelFaces(int buf[RE_MAX_FACES_PER_PIXEL][5],
- RE_APixstrExt *ap);
-
-/**
- * Compose the conflict and colour stacks
- * Note: Uses globals.
- */
-int composeStack(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
- struct RE_faceField* stack, int ptr,
- int totvlak, float x, float y, int osaNr);
-/**
- * Integrate conflicting layers.
- * Note: Uses globals.
- */
-int resolveConflict(struct RE_faceField* stack, int ptr, float x, float y);
-
-/**
- * Integrate the colour stack, defer conflicts.
- * Note: Uses globals.
- */
-void integrateStack(struct RE_faceField* stack, int ptr,
- float x, float y, int osaNr);
-
-/**
- * Calculate the view depth to this object on this location, with
- * the current view parameters in R.
- */
-int calcDepth(float x, float y, void *data, int type);
-
-
-
-/**
- * Fills in distances of all faces in a z buffer, for given jitter settings.
- */
-int fillZBufDistances(void);
-
-/**
- * Fills in distances of faces in the z buffer.
- *
- * Halo z buffering ----------------------------------------------
- *
- * A halo is treated here as a billboard: no z-extension, always
- * oriented perpendicular to the viewer. The rest of the z-buffer
- * stores face-numbers first, then calculates colours as the
- * final image is rendered. We'll use the same approach here,
- * which differs from the original method (which was add halos per
- * scan line). This means that the z-buffer now also needs to
- * store info about what sort of 'thing' the index refers to.
- *
- * Halo extension:
- * h.maxy ---------
- * | h.xs + h.rad
- * | h.xs
- * | h.xs - h.rad
- * h.miny ---------
- *
- * These coordinates must be clipped to picture size.
- * I'm not quite certain about halo numbering.
- *
- * Halos and jittering -------------------------------------------
- *
- * Halos were not jittered previously. Now they are. I wonder
- * whether this may have some adverse effects here.
-
- * @return 1 for succes, 0 if the operation was interrupted.
- */
-int zBufferAllFaces(void);
-
-/**
- * Fills in distances of halos in the z buffer.
- * @return 1 for succes, 0 if the operation was interrupted.
- */
-int zBufferAllHalos(void);
-
-/**
- * New fill function for z buffer, for edge-only rendering.
- */
-void zBufferFillEdge(float *vec1, float *vec2);
-
-/**
- * New fill function for z buffer.
- */
-void zBufferFillFace(float *v1, float *v2, float *v3);
-
-/**
- * One more filler: fill in halo data in z buffer.
- * Empty so far, but may receive content of halo loop.
- */
-void zBufferFillHalo(void);
-
-/**
- * Copy the colour buffer output to R.rectot, to line y.
- */
-void transferColourBufferToOutput(int y);
-
-/**
- * Set the colour buffer fields to zero.
- */
-void eraseColBuf(RE_COLBUFTYPE *buf);
-
-/**
- * Blend source over dest, and leave result in dest. 1 pixel.
- */
-void blendOverFloat(int type, float* dest, float* source, void* data);
-
-/**
- * Blend source over dest, and leave result in dest. 1 pixel into
- * multiple bins.
- */
-void blendOverFloatRow(int type, float* dest, float* source,
- void* data, int mask, int osaNr) ;
-
-/**
- * Do a post-process step on a finalized render image.
- */
-void std_transFloatColV2CharColV( RE_COLBUFTYPE *buf, char *target);
-
-#endif /* VANILLARENDERPIPE_INT_H */
-
diff --git a/source/blender/render/intern/include/zbuf.h b/source/blender/render/intern/include/zbuf.h
index fdfa5b19abe..fe72db4ee41 100644
--- a/source/blender/render/intern/include/zbuf.h
+++ b/source/blender/render/intern/include/zbuf.h
@@ -112,7 +112,7 @@ void zbuffershad(struct LampRen *lar);
* Also called in: render.c
* @param y the line number to set
*/
-void abufsetrow(int y);
+void abufsetrow(float *acolrow, int y);
/**
@@ -165,12 +165,12 @@ int vergzvlak(const void *x1, const void *x2);
* @param c2
* @param c3
*/
-void zbufclip(float *f1, float *f2, float *f3, int c1, int c2, int c3);
+void zbufclip(unsigned int zvlnr, float *f1, float *f2, float *f3, int c1, int c2, int c3);
/**
* same, for edges
*/
-void zbufclipwire(struct VlakRen *vlr);
+void zbufclipwire(unsigned int zvlnr, struct VlakRen *vlr);
#ifdef __cplusplus
}
diff --git a/source/blender/render/intern/include/zbuf_int.h b/source/blender/render/intern/include/zbuf_int.h
deleted file mode 100644
index 59a394d2908..00000000000
--- a/source/blender/render/intern/include/zbuf_int.h
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * zbuf_int.h
- * internal interface for zbuf.h (ie. functions that are not used
- * anywhere else)
- *
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * 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.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-#ifndef ZBUF_INT_H
-#define ZBUF_INT_H
-
-#include "render_types.h"
-#include "zbuf_types.h"
-
-/**
- * Convert a homogenous coordinate to a z buffer coordinate. The
- * function makes use of Zmulx, Zmuly, the x and y scale factors for
- * the screen, and Zjitx, Zjity, the pixel offset. (These are declared
- * in render.c) The normalised z coordinate must fall on [0, 1].
- * @param zco [3, 4 floats] pointer to the resulting z buffer coordinate
- * @param hoco [4 floats] pointer to the homogenous coordinate of the
- * vertex in world space.
- */
-void hoco_to_zco(float *zco, float *hoco);
-
-/**
- * Fill the z buffer for alpha?
- *
- * This is one of the z buffer fill functions called in zbufclip() and
- * zbufwireclip().
- *
- * @param v1 [4 floats, world coordinates] first vertex
- * @param v2 [4 floats, world coordinates] second vertex
- * @param v3 [4 floats, world coordinates] third vertex
- */
-void zbufinvulAc(float *v1, float *v2, float *v3);
-
-/**
- * Fill the z buffer, but invert z order, and add the face index to
- * the corresponing face buffer.
- *
- * This is one of the z buffer fill functions called in zbufclip() and
- * zbufwireclip().
- *
- * @param v1 [4 floats, world coordinates] first vertex
- * @param v2 [4 floats, world coordinates] second vertex
- * @param v3 [4 floats, world coordinates] third vertex
- */
-void zbufinvulGLinv(float *v1, float *v2, float *v3);
-
-/**
- * Fill the z buffer, and add the face index to
- * the corresponing face buffer. Writes into R.rectz and R.rectot. It
- * assumes that Zvlnr is set to the face index of the face under
- * consideration. Zvlnr is written into R.rectot. R.rectz
- *
- * This is one of the z buffer fill functions called in zbufclip() and
- * zbufwireclip().
- *
- * @param v1 [4 floats, world coordinates] first vertex
- * @param v2 [4 floats, world coordinates] second vertex
- * @param v3 [4 floats, world coordinates] third vertex
- */
-void zbufinvulGL(float *v1, float *v2, float *v3);
-
-/**
- * Fill the z buffer. The face buffer is not operated on!
- *
- * This is one of the z buffer fill functions called in zbufclip() and
- * zbufwireclip().
- *
- * @param v1 [4 floats, world coordinates] first vertex
- * @param v2 [4 floats, world coordinates] second vertex
- * @param v3 [4 floats, world coordinates] third vertex
- */
-void zbufinvulGL_onlyZ(float *v1, float *v2, float *v3);
-
-/**
- * Prints 3 unlabelled floating point values to stdout. Used for diagnostics.
- * @param v1 any float
- * @param v2 any float
- * @param v3 any float
- */
-void print3floats(float *v1, float *v2, float *v3);
-
-/**
- * Checks labda and uses this to make decision about clipping the line
- * segment from v1 to v2. labda is the factor by which the vector is
- * cut. ( calculate s + l * ( t - s )). The result is appended to the
- * vertex list of this face.
- * Note: uses globals.
- * (arguments: one int, one pointer to int... why?)
- * @param v1 start coordinate s
- * @param v2 target coordinate t
- * @param b1
- * @param b2
- * @param clve vertex vector.
- */
-static void maakvertpira(float *v1, float *v2, int *b1, int b2, int *clve);
-
-/**
- * Sets labda: flag, and parametrize the clipping of vertices in
- * viewspace coordinates. labda = -1 means no clipping, labda in [0,
- * 1] means a clipping.
- * Note: uses globals.
- * @param v1 start coordinate s
- * @param v2 target coordinate t
- * @param b1
- * @param b2
- * @param b3
- * @param a index for coordinate (x, y, or z)
- */
-static void clipp(float *v1, float *v2, int b1, int *b2, int *b3, int a);
-
-/**
- * Tests whether this coordinate is 'inside' or 'outside' of the view
- * volume? By definition, this is in [0, 1].
- * @param p vertex z difference plus coordinate difference?
- * @param q origin z plus r minus some coordinate?
- * @param u1 [in/out] clip fraction for ?
- * @param u2 [in/out]
- * @return 0 if point is outside, or 1 if the point lies on the clip
- * boundary
- */
-static short cliptestf(float p, float q, float *u1, float *u2);
-
-
-/* not documented yet */
-/* not sure if these should stay static... */
-
-static int clipline(float *v1, float *v2);
-
-/**
- * Provide book-keeping for the z buffer data lists.
- */
-APixstr *addpsmainA(void);
-void freepsA(void);
-APixstr *addpsA(void);
-
-/**
- * Fill function for the z buffer (fills lines)
- */
-void zbuflineAc(float *vec1, float *vec2);
-void zbufline(float *vec1, float *vec2);
-
-
-/**
- * Copy results from the solid face z buffering to the transparent
- * buffer.
- */
-void copyto_abufz(int sample);
-
-/**
- * Do accumulation z buffering.
- */
-void zbuffer_abuf(void);
-
-/**
- * Shade this face at this location in SCS.
- */
-void shadetrapixel(float x, float y, int vlak, int mask, unsigned short *shortcol);
-
-/**
- * Determine the distance to the camera of this halo, in ZCS.
- */
-unsigned int calcHaloDist(HaloRen *har);
-
-#endif /* ZBUF_INT_H */
-
diff --git a/source/blender/render/intern/source/Makefile b/source/blender/render/intern/source/Makefile
index 400e6045c03..b55084b708b 100644
--- a/source/blender/render/intern/source/Makefile
+++ b/source/blender/render/intern/source/Makefile
@@ -58,6 +58,7 @@ CPPFLAGS += -I../../../../kernel/gen_messaging
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
# not very neat: the rest of blender..
CPPFLAGS += -I../../../include
+CPPFLAGS += $(NAN_SDLCFLAGS)
ifeq ($(WITH_QUICKTIME), true)
CPPFLAGS += -DWITH_QUICKTIME
diff --git a/source/blender/render/intern/source/RE_callbacks.c b/source/blender/render/intern/source/RE_callbacks.c
index c6b74867c73..acc115b2b87 100644
--- a/source/blender/render/intern/source/RE_callbacks.c
+++ b/source/blender/render/intern/source/RE_callbacks.c
@@ -34,7 +34,6 @@
#include <stdlib.h> /* for NULL??? */
#include <stdio.h>
#include "render.h"
-#include "render_intern.h"
#include "RE_callbacks.h"
#ifdef HAVE_CONFIG_H
diff --git a/source/blender/render/intern/source/edgeRender.c b/source/blender/render/intern/source/edgeRender.c
index 51d24236cd3..2181224871b 100644
--- a/source/blender/render/intern/source/edgeRender.c
+++ b/source/blender/render/intern/source/edgeRender.c
@@ -60,11 +60,11 @@
#include "MEM_guardedalloc.h"
#include "MTC_vectorops.h"
+#include "BKE_utildefines.h"
#include "RE_callbacks.h"
#include "edgeRender.h"
#include "render.h"
-#include "render_intern.h"
#include "zbuf.h" /* for zbufclipwire and zbufclip */
#include "jitter.h"
@@ -79,18 +79,12 @@ char edgeRender_c[] = "$Id$";
#endif
/* ------------------------------------------------------------------------- */
-/* the lazy way: */
-#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
-
-/* ------------------------------------------------------------------------- */
/* These function pointers are used for z buffer filling. */
-extern void (*zbuffunc)(float *, float *, float *);
-extern void (*zbuflinefunc)(float *, float *);
+extern void (*zbuffunc)(unsigned int, float *, float *, float *);
+extern void (*zbuflinefunc)(unsigned int, float *, float *);
extern float Zmulx, Zmuly; /* Some kind of scale? */
extern float Zjitx,Zjity; /* The x,y values for jitter offset */
-extern unsigned int Zvlnr; /* Face rendering pointer and counter: these */
-extern VlakRen *Zvlr; /* are used for 'caching' render results. */
/* ------------------------------------------------------------------------- */
@@ -148,12 +142,12 @@ void renderEdges(char * colourRect);
/**
* Buffer an edge between these two vertices in the e.r. distance buffer.
*/
-void fillEdgeRenderEdge(float *vec1, float *vec2);
+static void fillEdgeRenderEdge(unsigned int, float *vec1, float *vec2);
/**
* Buffer a face between these two vertices in the e.r. distance buffer.
*/
-void fillEdgeRenderFace(float *v1, float *v2, float *v3);
+static void fillEdgeRenderFace(unsigned int, float *v1, float *v2, float *v3);
/**
* Compose the edge render colour buffer.
@@ -598,6 +592,8 @@ void calcEdgeRenderColBuf(char* colTargetBuffer)
/* rendering, this should be ok. */
int zBufferEdgeRenderObjects(void)
{
+ VlakRen *vlr= NULL;
+ unsigned int zvlnr;
int keepLooping;
int faceCounter; /* counter for face number */
Material *ma;
@@ -607,30 +603,30 @@ int zBufferEdgeRenderObjects(void)
faceCounter = 0;
while ( (faceCounter < R.totvlak) && keepLooping) {
- if((faceCounter & 255)==0) { Zvlr= R.blovl[faceCounter>>8]; }
- else Zvlr++;
+ if((faceCounter & 255)==0) { vlr= R.blovl[faceCounter>>8]; }
+ else vlr++;
- ma= Zvlr->mat;
+ ma= vlr->mat;
/*exp*/
mat_cache = ma;
/* face number is used in the fill functions */
- Zvlnr = faceCounter + 1;
+ zvlnr = faceCounter + 1;
- if(Zvlr->flag & R_VISIBLE) {
+ if(vlr->flag & R_VISIBLE) {
/* here we cull all transparent faces if mode == 0 */
if (selectmode || !(ma->mode & MA_ZTRA)) {
/* here we can add all kinds of extra selection criteria */
- if(ma->mode & (MA_WIRE)) zbufclipwire(Zvlr);
+ if(ma->mode & (MA_WIRE)) zbufclipwire(zvlnr, vlr);
else {
- zbufclip(Zvlr->v1->ho, Zvlr->v2->ho, Zvlr->v3->ho,
- Zvlr->v1->clip, Zvlr->v2->clip, Zvlr->v3->clip);
- if(Zvlr->v4) {
- Zvlnr+= 0x800000; /* in a sense, the 'adjoint' face */
- zbufclip(Zvlr->v1->ho, Zvlr->v3->ho, Zvlr->v4->ho,
- Zvlr->v1->clip, Zvlr->v3->clip, Zvlr->v4->clip);
+ zbufclip(zvlnr, vlr->v1->ho, vlr->v2->ho, vlr->v3->ho,
+ vlr->v1->clip, vlr->v2->clip, vlr->v3->clip);
+ if(vlr->v4) {
+ zvlnr+= 0x800000; /* in a sense, the 'adjoint' face */
+ zbufclip(zvlnr, vlr->v1->ho, vlr->v3->ho, vlr->v4->ho,
+ vlr->v1->clip, vlr->v3->clip, vlr->v4->clip);
}
}
}
@@ -643,7 +639,7 @@ int zBufferEdgeRenderObjects(void)
/* ------------------------------------------------------------------------- */
-void fillEdgeRenderFace(float *v1, float *v2, float *v3)
+static void fillEdgeRenderFace(unsigned int zvlnr, float *v1, float *v2, float *v3)
{
/* Coordinates of the vertices are specified in ZCS */
double z0; /* used as temp var*/
@@ -851,7 +847,7 @@ void fillEdgeRenderFace(float *v1, float *v2, float *v3)
/* ------------------------------------------------------------------------- */
-void fillEdgeRenderEdge(float *vec1, float *vec2)
+static void fillEdgeRenderEdge(unsigned int zvlnr, float *vec1, float *vec2)
{
int start, end, x, y, oldx, oldy, ofs;
int dz, vergz/* , mask */;
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index f5a87ba7ae7..99ff21bd44e 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -49,6 +49,8 @@
#include "MEM_guardedalloc.h"
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
+#include "BKE_utildefines.h"
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h" /* for rectcpy */
@@ -58,38 +60,24 @@
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
-#include "BIF_space.h"
-#include "BIF_toolbox.h"
-
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_global.h"
#include "BKE_world.h" // init_render_world
#include "BKE_image.h" // BKE_write_ibuf
+#include "MTC_matrixops.h"
/* this module */
#include "RE_callbacks.h"
#include "render.h"
-#include "render_intern.h"
#include "envmap.h"
#include "mydevice.h"
-#include "rendercore.h" /* calls zbufShade(DA).... I want to replace this with my own :)*/
+#include "rendercore.h"
#include "renderHelp.h"
-#include "MTC_matrixops.h"
+#include "texture.h"
#include "zbuf.h"
-/* ------------------------------------------------------------------------- */
-
-void envmap_split_ima(EnvMap *env);
-void envmap_renderdata(EnvMap *env);
-void envmap_transmatrix(float mat[][4], int part);
-void env_rotate_scene(float mat[][4], int mode);
-void env_layerflags(unsigned int notlay);
-void env_set_imats(void);
-void render_envmap(EnvMap *env);
-int envcube_isect(float *vec, float *answ);
-static void set_dxtdyt(float *dxts, float *dyts, float *dxt, float *dyt, int face);
/* ------------------------------------------------------------------------- */
@@ -156,7 +144,7 @@ void RE_free_envmap(EnvMap *env)
/* ------------------------------------------------------------------------- */
-void envmap_split_ima(EnvMap *env)
+static void envmap_split_ima(EnvMap *env)
{
ImBuf *ibuf;
Image *ima;
@@ -168,7 +156,7 @@ void envmap_split_ima(EnvMap *env)
dx= env->ima->ibuf->y;
dx/= 2;
if(3*dx != env->ima->ibuf->x) {
- error("Incorrect envmap size");
+ printf("Incorrect envmap size\n");
env->ok= 0;
env->ima->ok= 0;
}
@@ -199,7 +187,7 @@ void envmap_split_ima(EnvMap *env)
/* ------------------------------------------------------------------------- */
/* ****************** RENDER ********************** */
-void envmap_renderdata(EnvMap *env)
+static void envmap_renderdata(EnvMap *env)
{
static RE_Render envR;
static Object *camera;
@@ -245,7 +233,7 @@ void envmap_renderdata(EnvMap *env)
/* ------------------------------------------------------------------------- */
-void envmap_transmatrix(float mat[][4], int part)
+static void envmap_transmatrix(float mat[][4], int part)
{
float tmat[4][4], eul[3], rotmat[4][4];
@@ -277,7 +265,7 @@ void envmap_transmatrix(float mat[][4], int part)
/* ------------------------------------------------------------------------- */
-void env_rotate_scene(float mat[][4], int mode)
+static void env_rotate_scene(float mat[][4], int mode)
{
VlakRen *vlr = NULL;
VertRen *ver = NULL;
@@ -366,7 +354,7 @@ void env_rotate_scene(float mat[][4], int mode)
/* ------------------------------------------------------------------------- */
-void env_layerflags(unsigned int notlay)
+static void env_layerflags(unsigned int notlay)
{
VlakRen *vlr = NULL;
int a;
@@ -392,7 +380,7 @@ void env_hideobject(Object *ob)
/* ------------------------------------------------------------------------- */
-void env_set_imats()
+static void env_set_imats()
{
Base *base;
float mat[4][4];
@@ -409,7 +397,7 @@ void env_set_imats()
/* ------------------------------------------------------------------------- */
-void render_envmap(EnvMap *env)
+static void render_envmap(EnvMap *env)
{
/* only the cubemap is implemented */
ImBuf *ibuf;
@@ -420,6 +408,11 @@ void render_envmap(EnvMap *env)
/* need a recalc: ortho-render has no correct viewinv */
MTC_Mat4Invert(oldviewinv, R.viewmat);
+ /* do first, envmap_renderdata copies entire R struct */
+ if(R.rectz) MEM_freeN(R.rectz); R.rectz= NULL;
+ if(R.rectot) MEM_freeN(R.rectot); R.rectot= NULL;
+ if(R.rectftot) MEM_freeN(R.rectftot); R.rectftot= NULL;
+
/* setup necessary globals */
envmap_renderdata(env);
@@ -480,8 +473,9 @@ void render_envmap(EnvMap *env)
}
- if(R.rectz) MEM_freeN(R.rectz); R.rectz= 0;
- if(R.rectot) MEM_freeN(R.rectot); R.rectot= 0;
+ if(R.rectz) MEM_freeN(R.rectz); R.rectz= NULL;
+ if(R.rectot) MEM_freeN(R.rectot); R.rectot= NULL;
+ if(R.rectftot) MEM_freeN(R.rectftot); R.rectftot= NULL;
if(RE_local_test_break()) RE_free_envmapdata(env);
else {
@@ -557,7 +551,7 @@ void make_envmaps()
if(do_init) {
RE_local_init_render_display();
RE_local_clear_render_display(R.win);
- allqueue(REDRAWBUTSSHADING, 0); // bad!
+ R.flag |= R_REDRAW_PRV;
}
// restore
R.r.mode |= trace;
@@ -566,7 +560,7 @@ void make_envmaps()
/* ------------------------------------------------------------------------- */
-int envcube_isect(float *vec, float *answ)
+static int envcube_isect(float *vec, float *answ)
{
float labda;
int face;
@@ -639,17 +633,16 @@ static void set_dxtdyt(float *dxts, float *dyts, float *dxt, float *dyt, int fac
/* ------------------------------------------------------------------------- */
-extern float Tin, Ta, Tr, Tg, Tb; /* texture.c */
-int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex)
+int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexResult *texres)
{
/* texvec should be the already reflected normal */
EnvMap *env;
- float fac, vec[3], sco[3], col[20], dxts[3], dyts[3];
+ float fac, vec[3], sco[3], dxts[3], dyts[3];
int face, face1;
env= tex->env;
if(env==0 || env->object==0) {
- Tin= 0.0;
+ texres->tin= 0.0;
return 0;
}
if(env->stype==ENV_LOAD) {
@@ -662,7 +655,7 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex)
if(env->ok==0) {
- Tin= 0.0;
+ texres->tin= 0.0;
return 0;
}
@@ -674,16 +667,17 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex)
tex->ima= env->cube[face];
if(osatex) {
+
MTC_Mat4Mul3Vecfl(env->object->imat, dxt);
MTC_Mat4Mul3Vecfl(env->object->imat, dyt);
set_dxtdyt(dxts, dyts, dxt, dyt, face);
- imagewraposa(tex, sco, dxts, dyts);
+ imagewraposa(tex, sco, dxts, dyts, texres);
/* edges? */
- if(Ta<1.0) {
- col[0]= Ta; col[1]= Tr; col[2]= Tg; col[3]= Tb;
+ if(texres->ta<1.0) {
+ TexResult texr1, texr2;
VecAddf(vec, vec, dxt);
face1= envcube_isect(vec, sco);
@@ -692,12 +686,11 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex)
if(face!=face1) {
tex->ima= env->cube[face1];
set_dxtdyt(dxts, dyts, dxt, dyt, face1);
- imagewraposa(tex, sco, dxts, dyts);
- col[4]= Ta; col[5]= Tr; col[6]= Tg; col[7]= Tb;
+ imagewraposa(tex, sco, dxts, dyts, &texr1);
}
- else col[4]= col[5]= col[6]= col[7]= 0.0;
+ else texr1.tr= texr1.tg= texr1.tb= texr1.ta= 0.0;
- /* here was the nasty bug! col[5,6,7] were not zero-ed. FPE! */
+ /* here was the nasty bug! results were not zero-ed. FPE! */
VecAddf(vec, vec, dyt);
face1= envcube_isect(vec, sco);
@@ -706,23 +699,23 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex)
if(face!=face1) {
tex->ima= env->cube[face1];
set_dxtdyt(dxts, dyts, dxt, dyt, face1);
- imagewraposa(tex, sco, dxts, dyts);
- col[8]= Ta; col[9]= Tr; col[10]= Tg; col[11]= Tb;
+ imagewraposa(tex, sco, dxts, dyts, &texr2);
}
- else col[8]= col[9]= col[10]= col[11]= 0.0;
-
- fac= (col[0]+col[4]+col[8]);
- fac= 1.0/fac;
+ else texr2.tr= texr2.tg= texr2.tb= texr2.ta= 0.0;
- Tr= fac*(col[0]*col[1] + col[4]*col[5] + col[8]*col[9] );
- Tg= fac*(col[0]*col[2] + col[4]*col[6] + col[8]*col[10] );
- Tb= fac*(col[0]*col[3] + col[4]*col[7] + col[8]*col[11] );
- Ta= 1.0;
-
+ fac= (texres->ta+texr1.ta+texr2.ta);
+ if(fac!=0.0) {
+ fac= 1.0/fac;
+
+ texres->tr= fac*(texres->ta*texres->tr + texr1.ta*texr1.tr + texr2.ta*texr2.tr );
+ texres->tg= fac*(texres->ta*texres->tg + texr1.ta*texr1.tg + texr2.ta*texr2.tg );
+ texres->tb= fac*(texres->ta*texres->tb + texr1.ta*texr1.tb + texr2.ta*texr2.tb );
+ }
+ texres->ta= 1.0;
}
}
else {
- imagewrap(tex, sco);
+ imagewrap(tex, sco, texres);
}
tex->ima= env->ima;
diff --git a/source/blender/render/intern/source/errorHandler.c b/source/blender/render/intern/source/errorHandler.c
index ed72a68a968..0ab927a9cd9 100644
--- a/source/blender/render/intern/source/errorHandler.c
+++ b/source/blender/render/intern/source/errorHandler.c
@@ -33,8 +33,8 @@
#include "GEN_messaging.h"
#include "stdio.h"
+
#include "errorHandler.h"
-#include "render_intern.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
diff --git a/source/blender/render/intern/source/gammaCorrectionTables.c b/source/blender/render/intern/source/gammaCorrectionTables.c
index 8af6edf76da..0e27aacd9e3 100644
--- a/source/blender/render/intern/source/gammaCorrectionTables.c
+++ b/source/blender/render/intern/source/gammaCorrectionTables.c
@@ -35,7 +35,6 @@
#include "gammaCorrectionTables.h"
#include <stdlib.h>
#include <math.h>
-#include "render_intern.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -65,7 +64,7 @@ static float inv_colour_step;
static float valid_gamma;
static float valid_inv_gamma;
static int gamma_table_initialised = 0;
-static int do_gamma;
+int do_gamma=0;
/* ------------------------------------------------------------------------- */
float gammaCorrect(float c)
@@ -153,19 +152,5 @@ int gammaTableIsInitialised(void)
}
/* ------------------------------------------------------------------------- */
-int doGamma()
-{
- return do_gamma;
-}
-
-/* ------------------------------------------------------------------------- */
-
-/**
- * Set/unset performing gamma corrections.
- */
-void setDoGamma(int i)
-{
- do_gamma = i;
-}
/* eof */
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
new file mode 100644
index 00000000000..e961729df16
--- /dev/null
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -0,0 +1,911 @@
+/**
+ *
+ * $Id:
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+
+
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <math.h>
+#ifndef WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+
+#include "DNA_image_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_texture_types.h"
+
+#include "BLI_blenlib.h"
+
+#include "BKE_utildefines.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_image.h"
+#include "BKE_texture.h"
+#include "BKE_library.h"
+
+#include "SDL_thread.h"
+
+#include "render.h"
+#include "texture.h"
+
+
+int imaprepeat, imapextend;
+
+
+/* *********** IMAGEWRAPPING ****************** */
+
+
+int imagewrap(Tex *tex, float *texvec, TexResult *texres)
+{
+ Image *ima;
+ struct ImBuf *ibuf;
+ float fx, fy, val1, val2, val3;
+ int ofs, x, y;
+ char *rect;
+
+ texres->tin= texres->ta= texres->tr= texres->tg= texres->tb= 0.0;
+ ima= tex->ima;
+ if(ima==NULL || ima->ok== 0) {
+ return 0;
+ }
+
+ if(ima->ibuf==NULL) {
+ extern SDL_mutex *load_ibuf_lock; // initrender.c
+ if(load_ibuf_lock) SDL_mutexP(load_ibuf_lock);
+ if(ima->ibuf==NULL) ima_ibuf_is_nul(tex);
+ if(load_ibuf_lock) SDL_mutexV(load_ibuf_lock);
+ }
+
+ if (ima->ok) {
+ ibuf = ima->ibuf;
+
+ if(tex->imaflag & TEX_IMAROT) {
+ fy= texvec[0];
+ fx= texvec[1];
+ }
+ else {
+ fx= texvec[0];
+ fy= texvec[1];
+ }
+
+ if(tex->extend == TEX_CHECKER) {
+ int xs, ys;
+
+ xs= (int)floor(fx);
+ ys= (int)floor(fy);
+ fx-= xs;
+ fy-= ys;
+
+ if( (tex->flag & TEX_CHECKER_ODD)==0) {
+ if((xs+ys) & 1);else return 0;
+ }
+ if( (tex->flag & TEX_CHECKER_EVEN)==0) {
+ if((xs+ys) & 1) return 0;
+ }
+ /* scale around center, (0.5, 0.5) */
+ if(tex->checkerdist<1.0) {
+ fx= (fx-0.5)/(1.0-tex->checkerdist) +0.5;
+ fy= (fy-0.5)/(1.0-tex->checkerdist) +0.5;
+ }
+ }
+
+ x = (int)(fx*ibuf->x);
+ y = (int)(fy*ibuf->y);
+
+ if(tex->extend == TEX_CLIPCUBE) {
+ if(x<0 || y<0 || x>=ibuf->x || y>=ibuf->y || texvec[2]<-1.0 || texvec[2]>1.0) {
+ return 0;
+ }
+ }
+ else if( tex->extend==TEX_CLIP || tex->extend==TEX_CHECKER) {
+ if(x<0 || y<0 || x>=ibuf->x || y>=ibuf->y) {
+ return 0;
+ }
+ }
+ else {
+ if(tex->extend==TEX_EXTEND) {
+ if(x>=ibuf->x) x = ibuf->x-1;
+ else if(x<0) x= 0;
+ }
+ else {
+ x= x % ibuf->x;
+ if(x<0) x+= ibuf->x;
+ }
+ if(tex->extend==TEX_EXTEND) {
+ if(y>=ibuf->y) y = ibuf->y-1;
+ else if(y<0) y= 0;
+ }
+ else {
+ y= y % ibuf->y;
+ if(y<0) y+= ibuf->y;
+ }
+ }
+
+ /* warning, no return before setting back! */
+ if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
+ ibuf->rect+= (ibuf->x*ibuf->y);
+ }
+
+ ofs = y * ibuf->x + x;
+ rect = (char *)( ibuf->rect+ ofs);
+
+ if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
+ ibuf->rect-= (ibuf->x*ibuf->y);
+ }
+
+ if(tex->imaflag & TEX_USEALPHA) {
+ if(tex->imaflag & TEX_CALCALPHA);
+ else texres->talpha= 1;
+ }
+
+ texres->tr = ((float)rect[0])/255.0f;
+ texres->tg = ((float)rect[1])/255.0f;
+ texres->tb = ((float)rect[2])/255.0f;
+
+ if(texres->nor) {
+ if(tex->imaflag & TEX_NORMALMAP) {
+ texres->nor[0]= 0.5-texres->tr;
+ texres->nor[1]= 0.5-texres->tg;
+ texres->nor[2]= -texres->tb;
+ }
+ else {
+ /* bump: take three samples */
+ val1= texres->tr+texres->tg+texres->tb;
+
+ if(x<ibuf->x-1) {
+ rect+=4;
+ val2= ((float)(rect[0]+rect[1]+rect[2]))/255.0f;
+ rect-=4;
+ }
+ else val2= val1;
+
+ if(y<ibuf->y-1) {
+ rect+= 4*ibuf->x;
+ val3= ((float)(rect[0]+rect[1]+rect[2]))/255.0f;
+ }
+ else val3= val1;
+
+ /* do not mix up x and y here! */
+ texres->nor[0]= (val1-val2);
+ texres->nor[1]= (val1-val3);
+ }
+ }
+
+ //BRICONTRGB;
+
+ if(texres->talpha) texres->ta= texres->tin= ((float)rect[3])/255.0f;
+ else if(tex->imaflag & TEX_CALCALPHA) {
+ texres->ta= texres->tin= MAX3(texres->tr, texres->tg, texres->tb);
+ }
+ else texres->ta= texres->tin= 1.0;
+
+ if(tex->flag & TEX_NEGALPHA) texres->ta= 1.0f-texres->ta;
+
+ }
+
+ if(texres->nor) return 3;
+ else return 1;
+}
+
+static void clipx_rctf_swap(rctf *stack, short *count, float x1, float x2)
+{
+ rctf *rf, *newrct;
+ short a;
+
+ a= *count;
+ rf= stack;
+ for(;a>0;a--) {
+ if(rf->xmin<x1) {
+ if(rf->xmax<x1) {
+ rf->xmin+= (x2-x1);
+ rf->xmax+= (x2-x1);
+ }
+ else {
+ if(rf->xmax>x2) rf->xmax= x2;
+ newrct= stack+ *count;
+ (*count)++;
+
+ newrct->xmax= x2;
+ newrct->xmin= rf->xmin+(x2-x1);
+ newrct->ymin= rf->ymin;
+ newrct->ymax= rf->ymax;
+
+ if(newrct->xmin==newrct->xmax) (*count)--;
+
+ rf->xmin= x1;
+ }
+ }
+ else if(rf->xmax>x2) {
+ if(rf->xmin>x2) {
+ rf->xmin-= (x2-x1);
+ rf->xmax-= (x2-x1);
+ }
+ else {
+ if(rf->xmin<x1) rf->xmin= x1;
+ newrct= stack+ *count;
+ (*count)++;
+
+ newrct->xmin= x1;
+ newrct->xmax= rf->xmax-(x2-x1);
+ newrct->ymin= rf->ymin;
+ newrct->ymax= rf->ymax;
+
+ if(newrct->xmin==newrct->xmax) (*count)--;
+
+ rf->xmax= x2;
+ }
+ }
+ rf++;
+ }
+
+}
+
+static void clipy_rctf_swap(rctf *stack, short *count, float y1, float y2)
+{
+ rctf *rf, *newrct;
+ short a;
+
+ a= *count;
+ rf= stack;
+ for(;a>0;a--) {
+ if(rf->ymin<y1) {
+ if(rf->ymax<y1) {
+ rf->ymin+= (y2-y1);
+ rf->ymax+= (y2-y1);
+ }
+ else {
+ if(rf->ymax>y2) rf->ymax= y2;
+ newrct= stack+ *count;
+ (*count)++;
+
+ newrct->ymax= y2;
+ newrct->ymin= rf->ymin+(y2-y1);
+ newrct->xmin= rf->xmin;
+ newrct->xmax= rf->xmax;
+
+ if(newrct->ymin==newrct->ymax) (*count)--;
+
+ rf->ymin= y1;
+ }
+ }
+ else if(rf->ymax>y2) {
+ if(rf->ymin>y2) {
+ rf->ymin-= (y2-y1);
+ rf->ymax-= (y2-y1);
+ }
+ else {
+ if(rf->ymin<y1) rf->ymin= y1;
+ newrct= stack+ *count;
+ (*count)++;
+
+ newrct->ymin= y1;
+ newrct->ymax= rf->ymax-(y2-y1);
+ newrct->xmin= rf->xmin;
+ newrct->xmax= rf->xmax;
+
+ if(newrct->ymin==newrct->ymax) (*count)--;
+
+ rf->ymax= y2;
+ }
+ }
+ rf++;
+ }
+}
+
+static float square_rctf(rctf *rf)
+{
+ float x, y;
+
+ x= rf->xmax- rf->xmin;
+ y= rf->ymax- rf->ymin;
+ return (x*y);
+}
+
+static float clipx_rctf(rctf *rf, float x1, float x2)
+{
+ float size;
+
+ size= rf->xmax - rf->xmin;
+
+ if(rf->xmin<x1) {
+ rf->xmin= x1;
+ }
+ if(rf->xmax>x2) {
+ rf->xmax= x2;
+ }
+ if(rf->xmin > rf->xmax) {
+ rf->xmin = rf->xmax;
+ return 0.0;
+ }
+ else if(size!=0.0) {
+ return (rf->xmax - rf->xmin)/size;
+ }
+ return 1.0;
+}
+
+static float clipy_rctf(rctf *rf, float y1, float y2)
+{
+ float size;
+
+ size= rf->ymax - rf->ymin;
+
+ if(rf->ymin<y1) {
+ rf->ymin= y1;
+ }
+ if(rf->ymax>y2) {
+ rf->ymax= y2;
+ }
+
+ if(rf->ymin > rf->ymax) {
+ rf->ymin = rf->ymax;
+ return 0.0;
+ }
+ else if(size!=0.0) {
+ return (rf->ymax - rf->ymin)/size;
+ }
+ return 1.0;
+
+}
+
+static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
+{
+ /* sample box, is clipped already, and minx etc. have been set at ibuf size.
+ Enlarge with antialiased edges of the pixels */
+
+ float muly,mulx,div;
+ int ofs;
+ int x, y, startx, endx, starty, endy;
+ char *rect;
+
+ startx= (int)floor(rf->xmin);
+ endx= (int)floor(rf->xmax);
+ starty= (int)floor(rf->ymin);
+ endy= (int)floor(rf->ymax);
+
+ if(startx < 0) startx= 0;
+ if(starty < 0) starty= 0;
+ if(endx>=ibuf->x) endx= ibuf->x-1;
+ if(endy>=ibuf->y) endy= ibuf->y-1;
+
+ if(starty==endy && startx==endx) {
+
+ ofs = starty*ibuf->x + startx;
+ rect = (char *)(ibuf->rect +ofs);
+ texres->tr= ((float)rect[0])/255.0f;
+ texres->tg= ((float)rect[1])/255.0f;
+ texres->tb= ((float)rect[2])/255.0f;
+ /* alpha has been set in function imagewraposa() */
+ if(texres->talpha) {
+ texres->ta= ((float)rect[3])/255.0f;
+ }
+ }
+ else {
+ div= texres->tr= texres->tg= texres->tb= texres->ta= 0.0;
+ for(y=starty;y<=endy;y++) {
+ ofs = y*ibuf->x +startx;
+ rect = (char *)(ibuf->rect+ofs);
+
+ muly= 1.0;
+
+ if(starty==endy);
+ else {
+ if(y==starty) muly= 1.0f-(rf->ymin - y);
+ if(y==endy) muly= (rf->ymax - y);
+ }
+ if(startx==endx) {
+ mulx= muly;
+ if(texres->talpha) texres->ta+= mulx*rect[3];
+ texres->tr+= mulx*rect[0];
+ texres->tg+= mulx*rect[1];
+ texres->tb+= mulx*rect[2];
+ div+= mulx;
+ }
+ else {
+ for(x=startx;x<=endx;x++) {
+ mulx= muly;
+ if(x==startx) mulx*= 1.0f-(rf->xmin - x);
+ if(x==endx) mulx*= (rf->xmax - x);
+
+ if(mulx==1.0) {
+ if(texres->talpha) texres->ta+= rect[3];
+ texres->tr+= rect[0];
+ texres->tg+= rect[1];
+ texres->tb+= rect[2];
+ div+= 1.0;
+ }
+ else {
+ if(texres->talpha) texres->ta+= mulx*rect[3];
+ texres->tr+= mulx*rect[0];
+ texres->tg+= mulx*rect[1];
+ texres->tb+= mulx*rect[2];
+ div+= mulx;
+ }
+ rect+=4;
+ }
+ }
+ }
+ if(div!=0.0) {
+ div*= 255.0;
+
+ texres->tb/= div;
+ texres->tg/= div;
+ texres->tr/= div;
+
+ if(texres->talpha) texres->ta/= div;
+ }
+ else {
+ texres->tr= texres->tg= texres->tb= texres->ta= 0.0;
+ }
+ }
+}
+
+static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres)
+{
+ /* Sample box, performs clip. minx etc are in range 0.0 - 1.0 .
+ * Enlarge with antialiased edges of pixels.
+ * If global variable 'imaprepeat' has been set, the
+ * clipped-away parts are sampled as well.
+ */
+ TexResult texr;
+ rctf *rf, stack[8];
+ float opp, tot, alphaclip= 1.0;
+ short count=1;
+
+ rf= stack;
+ rf->xmin= minx*(ibuf->x);
+ rf->xmax= maxx*(ibuf->x);
+ rf->ymin= miny*(ibuf->y);
+ rf->ymax= maxy*(ibuf->y);
+
+ if(imapextend);
+ else if(imaprepeat) clipx_rctf_swap(stack, &count, 0.0, (float)(ibuf->x));
+ else {
+ alphaclip= clipx_rctf(rf, 0.0, (float)(ibuf->x));
+
+ if(alphaclip<=0.0) {
+ texres->tr= texres->tb= texres->tg= texres->ta= 0.0;
+ return;
+ }
+ }
+
+ if(imapextend);
+ else if(imaprepeat) clipy_rctf_swap(stack, &count, 0.0, (float)(ibuf->y));
+ else {
+ alphaclip*= clipy_rctf(rf, 0.0, (float)(ibuf->y));
+
+ if(alphaclip<=0.0) {
+ texres->tr= texres->tb= texres->tg= texres->ta= 0.0;
+ return;
+ }
+ }
+
+ if(count>1) {
+ tot= texres->tr= texres->tb= texres->tg= texres->ta= 0.0;
+ while(count--) {
+ boxsampleclip(ibuf, rf, &texr);
+
+ opp= square_rctf(rf);
+ tot+= opp;
+
+ texres->tr+= opp*texr.tr;
+ texres->tg+= opp*texr.tg;
+ texres->tb+= opp*texr.tb;
+ if(texres->talpha) texres->ta+= opp*texr.ta;
+ rf++;
+ }
+ if(tot!= 0.0) {
+ texres->tr/= tot;
+ texres->tg/= tot;
+ texres->tb/= tot;
+ if(texres->talpha) texres->ta/= tot;
+ }
+ }
+ else {
+ boxsampleclip(ibuf, rf, texres);
+ }
+
+ if(texres->talpha==0) texres->ta= 1.0;
+
+ if(alphaclip!=1.0) {
+ /* this is for laetr investigation, premul or not? */
+ /* texres->tr*= alphaclip; */
+ /* texres->tg*= alphaclip; */
+ /* texres->tb*= alphaclip; */
+ texres->ta*= alphaclip;
+ }
+}
+
+static void makemipmap(Image *ima)
+{
+ struct ImBuf *ibuf;
+ int minsize, curmap=0;
+
+ ibuf= ima->ibuf;
+ minsize= MIN2(ibuf->x, ibuf->y);
+
+ while(minsize>3 && curmap<BLI_ARRAY_NELEMS(ima->mipmap)) {
+
+ ibuf= IMB_dupImBuf(ibuf);
+ IMB_filter(ibuf);
+ ima->mipmap[curmap]= (struct ImBuf *)IMB_onehalf(ibuf);
+ IMB_freeImBuf(ibuf);
+ ibuf= ima->mipmap[curmap];
+
+ curmap++;
+ minsize= MIN2(ibuf->x, ibuf->y);
+ }
+}
+
+
+int imagewraposa(Tex *tex, float *texvec, float *dxt, float *dyt, TexResult *texres)
+{
+ extern SDL_mutex *load_ibuf_lock; // initrender.c
+ TexResult texr;
+ Image *ima;
+ ImBuf *ibuf, *previbuf;
+ float fx, fy, minx, maxx, miny, maxy, dx, dy;
+ float maxd, pixsize, val1, val2, val3;
+ int curmap;
+
+
+ ima= tex->ima;
+
+ texres->tin= texres->ta= texres->tr= texres->tg= texres->tb= 0.0;
+
+ if(ima==NULL || ima->ok== 0) {
+ return 0;
+ }
+
+ if(ima->ibuf==NULL) {
+ if(load_ibuf_lock) SDL_mutexP(load_ibuf_lock);
+ if(ima->ibuf==NULL) ima_ibuf_is_nul(tex);
+ if(load_ibuf_lock) SDL_mutexV(load_ibuf_lock);
+ }
+
+ if (ima->ok) {
+
+ if(tex->imaflag & TEX_MIPMAP) {
+ if(ima->mipmap[0]==NULL) {
+ if(load_ibuf_lock) SDL_mutexP(load_ibuf_lock);
+ if(ima->mipmap[0]==NULL) makemipmap(ima);
+ if(load_ibuf_lock) SDL_mutexV(load_ibuf_lock);
+ }
+ }
+
+ ibuf = ima->ibuf;
+
+ if(tex->imaflag & TEX_USEALPHA) {
+ if(tex->imaflag & TEX_CALCALPHA);
+ else texres->talpha= 1;
+ }
+
+ texr.talpha= texres->talpha;
+
+ if(tex->imaflag & TEX_IMAROT) {
+ fy= texvec[0];
+ fx= texvec[1];
+ }
+ else {
+ fx= texvec[0];
+ fy= texvec[1];
+ }
+
+ if(ibuf->flags & IB_fields) {
+ if(R.r.mode & R_FIELDS) { /* field render */
+ if(R.flag & R_SEC_FIELD) { /* correction for 2nd field */
+ /* fac1= 0.5/( (float)ibuf->y ); */
+ /* fy-= fac1; */
+ }
+ else { /* first field */
+ fy+= 0.5f/( (float)ibuf->y );
+ }
+ }
+ }
+
+ /* pixel coordinates */
+
+ minx= MIN3(dxt[0],dyt[0],dxt[0]+dyt[0] );
+ maxx= MAX3(dxt[0],dyt[0],dxt[0]+dyt[0] );
+ miny= MIN3(dxt[1],dyt[1],dxt[1]+dyt[1] );
+ maxy= MAX3(dxt[1],dyt[1],dxt[1]+dyt[1] );
+
+ /* tex_sharper has been removed */
+
+ minx= tex->filtersize*(maxx-minx)/2.0f;
+ miny= tex->filtersize*(maxy-miny)/2.0f;
+
+ if(tex->imaflag & TEX_IMAROT) SWAP(float, minx, miny);
+
+ if(minx>0.25) minx= 0.25;
+ else if(minx<0.00001f) minx= 0.00001f; /* side faces of unit-cube */
+ if(miny>0.25) miny= 0.25;
+ else if(miny<0.00001f) miny= 0.00001f;
+
+
+ /* repeat and clip */
+
+ /* watch it: imaprepeat is global value (see boxsample) */
+ imaprepeat= (tex->extend==TEX_REPEAT);
+ imapextend= (tex->extend==TEX_EXTEND);
+
+ if(tex->extend == TEX_CHECKER) {
+ int xs, ys, xs1, ys1, xs2, ys2, boundary;
+
+ xs= (int)floor(fx);
+ ys= (int)floor(fy);
+
+ // both checkers available, no boundary exceptions, checkerdist will eat aliasing
+ if( (tex->flag & TEX_CHECKER_ODD) && (tex->flag & TEX_CHECKER_EVEN) ) {
+ fx-= xs;
+ fy-= ys;
+ }
+ else {
+
+ xs1= (int)floor(fx-minx);
+ ys1= (int)floor(fy-miny);
+ xs2= (int)floor(fx+minx);
+ ys2= (int)floor(fy+miny);
+ boundary= (xs1!=xs2) || (ys1!=ys2);
+
+ if(boundary==0) {
+ if( (tex->flag & TEX_CHECKER_ODD)==0) {
+ if((xs+ys) & 1);
+ else return 0;
+ }
+ if( (tex->flag & TEX_CHECKER_EVEN)==0) {
+ if((xs+ys) & 1) return 0;
+ }
+ fx-= xs;
+ fy-= ys;
+ }
+ else {
+ if(tex->flag & TEX_CHECKER_ODD) {
+ if((xs1+ys) & 1) fx-= xs2;
+ else fx-= xs1;
+
+ if((ys1+xs) & 1) fy-= ys2;
+ else fy-= ys1;
+ }
+ if(tex->flag & TEX_CHECKER_EVEN) {
+ if((xs1+ys) & 1) fx-= xs1;
+ else fx-= xs2;
+
+ if((ys1+xs) & 1) fy-= ys1;
+ else fy-= ys2;
+ }
+ }
+ }
+
+ /* scale around center, (0.5, 0.5) */
+ if(tex->checkerdist<1.0) {
+ fx= (fx-0.5)/(1.0-tex->checkerdist) +0.5;
+ fy= (fy-0.5)/(1.0-tex->checkerdist) +0.5;
+ minx/= (1.0-tex->checkerdist);
+ miny/= (1.0-tex->checkerdist);
+ }
+ }
+
+ if(tex->extend == TEX_CLIPCUBE) {
+ if(fx+minx<0.0 || fy+miny<0.0 || fx-minx>1.0 || fy-miny>1.0 || texvec[2]<-1.0 || texvec[2]>1.0) {
+ return 0;
+ }
+ }
+ else if(tex->extend==TEX_CLIP || tex->extend==TEX_CHECKER) {
+ if(fx+minx<0.0 || fy+miny<0.0 || fx-minx>1.0 || fy-miny>1.0) {
+ return 0;
+ }
+ }
+ else {
+ if(tex->extend==TEX_EXTEND) {
+ if(fx>1.0) fx = 1.0;
+ else if(fx<0.0) fx= 0.0;
+ }
+ else {
+ if(fx>1.0) fx -= (int)(fx);
+ else if(fx<0.0) fx+= 1-(int)(fx);
+ }
+
+ if(tex->extend==TEX_EXTEND) {
+ if(fy>1.0) fy = 1.0;
+ else if(fy<0.0) fy= 0.0;
+ }
+ else {
+ if(fy>1.0) fy -= (int)(fy);
+ else if(fy<0.0) fy+= 1-(int)(fy);
+ }
+ }
+
+ /* warning no return! */
+ if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
+ ibuf->rect+= (ibuf->x*ibuf->y);
+ }
+
+ /* choice: */
+ if(tex->imaflag & TEX_MIPMAP) {
+
+ dx= minx;
+ dy= miny;
+ maxd= MAX2(dx, dy);
+ if(maxd>0.5) maxd= 0.5;
+
+ pixsize = 1.0f/ (float) MIN2(ibuf->x, ibuf->y);
+
+ curmap= 0;
+ previbuf= ibuf;
+ while(curmap<BLI_ARRAY_NELEMS(ima->mipmap) && ima->mipmap[curmap]) {
+ if(maxd < pixsize) break;
+ previbuf= ibuf;
+ ibuf= ima->mipmap[curmap];
+ pixsize= 1.0f / (float)MIN2(ibuf->x, ibuf->y); /* this used to be 1.0 */
+ curmap++;
+ }
+
+ if(previbuf!=ibuf || (tex->imaflag & TEX_INTERPOL)) {
+ /* sample at least 1 pixel */
+ if (minx < 0.5f / ima->ibuf->x) minx = 0.5f / ima->ibuf->x;
+ if (miny < 0.5f / ima->ibuf->y) miny = 0.5f / ima->ibuf->y;
+ }
+
+ if(texres->nor && (tex->imaflag & TEX_NORMALMAP)==0) {
+ /* a bit extra filter */
+ minx*= 1.35f;
+ miny*= 1.35f;
+
+ boxsample(ibuf, fx-2.0f*minx, fy-2.0f*miny, fx+minx, fy+miny, texres);
+ val1= texres->tr+texres->tg+texres->tb;
+ boxsample(ibuf, fx-minx, fy-2.0f*miny, fx+2.0f*minx, fy+miny, &texr);
+ val2= texr.tr + texr.tg + texr.tb;
+ boxsample(ibuf, fx-2.0f*minx, fy-miny, fx+minx, fy+2.0f*miny, &texr);
+ val3= texr.tr + texr.tg + texr.tb;
+
+ if(previbuf!=ibuf) { /* interpolate */
+
+ boxsample(previbuf, fx-2.0f*minx, fy-2.0f*miny, fx+minx, fy+miny, &texr);
+
+ /* calc rgb */
+ dx= 2.0f*(pixsize-maxd)/pixsize;
+ if(dx>=1.0f) {
+ texres->ta= texr.ta; texres->tb= texr.tb;
+ texres->tg= texr.tg; texres->tr= texr.tr;
+ }
+ else {
+ dy= 1.0f-dx;
+ texres->tb= dy*texres->tb+ dx*texr.tb;
+ texres->tg= dy*texres->tg+ dx*texr.tg;
+ texres->tr= dy*texres->tr+ dx*texr.tr;
+ texres->ta= dy*texres->ta+ dx*texr.ta;
+ }
+
+ val1= dy*val1+ dx*(texr.tr + texr.tg + texr.tb);
+ boxsample(previbuf, fx-minx, fy-2.0f*miny, fx+2.0f*minx, fy+miny, &texr);
+ val2= dy*val2+ dx*(texr.tr + texr.tg + texr.tb);
+ boxsample(previbuf, fx-2.0f*minx, fy-miny, fx+minx, fy+2.0f*miny, &texr);
+ val3= dy*val3+ dx*(texr.tr + texr.tg + texr.tb);
+ }
+
+ /* don't switch x or y! */
+ texres->nor[0]= (val1-val2);
+ texres->nor[1]= (val1-val3);
+ }
+ else {
+ maxx= fx+minx;
+ minx= fx-minx;
+ maxy= fy+miny;
+ miny= fy-miny;
+
+ boxsample(ibuf, minx, miny, maxx, maxy, texres);
+
+ if(previbuf!=ibuf) { /* interpolate */
+ boxsample(previbuf, minx, miny, maxx, maxy, &texr);
+
+ fx= 2.0f*(pixsize-maxd)/pixsize;
+
+ if(fx>=1.0) {
+ texres->ta= texr.ta; texres->tb= texr.tb;
+ texres->tg= texr.tg; texres->tr= texr.tr;
+ } else {
+ fy= 1.0f-fx;
+ texres->tb= fy*texres->tb+ fx*texr.tb;
+ texres->tg= fy*texres->tg+ fx*texr.tg;
+ texres->tr= fy*texres->tr+ fx*texr.tr;
+ texres->ta= fy*texres->ta+ fx*texr.ta;
+ }
+ }
+ }
+ }
+ else {
+ if((tex->imaflag & TEX_INTERPOL)) {
+ /* sample 1 pixel minimum */
+ if (minx < 0.5f / ima->ibuf->x) minx = 0.5f / ima->ibuf->x;
+ if (miny < 0.5f / ima->ibuf->y) miny = 0.5f / ima->ibuf->y;
+ }
+
+ if(texres->nor && (tex->imaflag & TEX_NORMALMAP)==0) {
+
+ /* a bit extra filter */
+ minx*= 1.35f;
+ miny*= 1.35f;
+
+ boxsample(ibuf, fx-2.0f*minx, fy-2.0f*miny, fx+minx, fy+miny, texres);
+ val1= texres->tr+texres->tg+texres->tb;
+
+ boxsample(ibuf, fx-minx, fy-2.0f*miny, fx+2.0f*minx, fy+miny, &texr);
+ val2= texr.tr + texr.tg + texr.tb;
+
+ boxsample(ibuf, fx-2.0f*minx, fy-miny, fx+miny, fy+2.0f*miny, &texr);
+ val3= texr.tr + texr.tg + texr.tb;
+
+ /* don't switch x or y! */
+ texres->nor[0]= (val1-val2);
+ texres->nor[1]= (val1-val3);
+ }
+ else {
+ boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres);
+ }
+ }
+
+ BRICONTRGB;
+
+ if(tex->imaflag & TEX_CALCALPHA) {
+ texres->ta= texres->tin= texres->ta*MAX3(texres->tr, texres->tg, texres->tb);
+ }
+ else texres->tin= texres->ta;
+
+ if(tex->flag & TEX_NEGALPHA) texres->ta= 1.0f-texres->ta;
+
+ if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
+ ibuf->rect-= (ibuf->x*ibuf->y);
+ }
+
+ if(texres->nor && (tex->imaflag & TEX_NORMALMAP)) {
+ texres->nor[0]= 0.5-texres->tr;
+ texres->nor[1]= 0.5-texres->tg;
+ texres->nor[2]= -texres->tb;
+ }
+ }
+ else {
+ texres->tin= 0.0f;
+ return 0;
+ }
+
+ if(texres->nor) return 3;
+ else return 1;
+}
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index be1f659d7e6..b4edee17bb6 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -86,17 +86,20 @@
#include "quicktime_export.h"
#endif
+#include "SDL_thread.h"
+
/* this module */
#include "render.h"
-#include "render_intern.h"
#include "RE_callbacks.h"
#include "zbuf.h"
#include "rendercore.h" /* part handler for the old renderer, shading functions */
+#include "pixelshading.h"
#include "renderPreAndPost.h"
#include "vanillaRenderPipe.h"
#include "renderHelp.h"
#include "jitter.h"
+#include "gammaCorrectionTables.h"
/* Own includes */
#include "initrender.h"
@@ -104,72 +107,16 @@
/* yafray: include for yafray export/render */
#include "YafRay_Api.h"
-/* Some crud :/ */
-#define ELEM3(a, b, c, d) ( ELEM(a, b, c) || (a)==(d) )
-
-/* from render.c */
-extern float fmask[256], centLut[16], *fmask1[9], *fmask2[9];
-extern unsigned short *mask1[9], *mask2[9], *igamtab2;
-extern char cmask[256], *centmask;
+float centLut[16], *fmask1[9], *fmask2[9];
+unsigned short *gamtab, *igamtab2, *igamtab1;
+char cmask[256], *centmask;
Material defmaterial;
-short pa; /* pa is global part, for print */
-short allparts[65][4];
-int qscount;
-
-/* ********************* *********************** */
-
-
-void init_def_material(void)
-{
- Material *ma;
-
- ma= &defmaterial;
-
- init_material(&defmaterial);
-
- init_render_material(ma);
-}
-
-void RE_init_render_data(void)
-{
- memset(&R, 0, sizeof(RE_Render));
- memset(&O, 0, sizeof(Osa));
- O.dxwin[0]= 1.0;
- O.dywin[1]= 1.0;
-
- R.blove= (VertRen **)MEM_callocN(sizeof(void *)*(TABLEINITSIZE),"Blove");
- R.blovl= (VlakRen **)MEM_callocN(sizeof(void *)*(TABLEINITSIZE),"Blovl");
- R.bloha= (HaloRen **)MEM_callocN(sizeof(void *)*(TABLEINITSIZE),"Bloha");
- R.la= (LampRen **)MEM_mallocN(LAMPINITSIZE*sizeof(void *),"renderlamparray");
-
- init_def_material();
-}
-
-void RE_free_render_data()
-{
- MEM_freeN(R.blove);
- R.blove= 0;
- MEM_freeN(R.blovl);
- R.blovl= 0;
- MEM_freeN(R.bloha);
- R.bloha= 0;
- MEM_freeN(R.la);
- R.la= 0;
- if(R.rectot) MEM_freeN(R.rectot);
- if(R.rectz) MEM_freeN(R.rectz);
- if(R.rectspare) MEM_freeN(R.rectspare);
- R.rectot= 0;
- R.rectz= 0;
- R.rectspare= 0;
-
- end_render_material(&defmaterial);
-}
/* ****************** GAMMA, MASKS and LUTS **************** */
-float calc_weight(float *weight, int i, int j)
+static float calc_weight(float *weight, int i, int j)
{
float x, y, dist, totw= 0.0, fac;
int a;
@@ -201,23 +148,20 @@ float calc_weight(float *weight, int i, int j)
return totw;
}
-void RE_init_filt_mask(void)
+static void init_filt_mask(void)
{
static int firsttime=1;
static int lastosa=0;
static int lastgauss=0;
static float lastgamma= 0.0;
- float gamma, igamma, flweight[32];
+ float gamma, igamma, flweight[32], fmask[256];
float weight[32], totw, val, *fpx1, *fpx2, *fpy1, *fpy2, *m3, *m4;
int i, j, a;
- unsigned short *m1, *m2, shweight[32];
if(firsttime) {
firsttime= 0;
for(a=0; a<9;a++) {
- mask1[a]= MEM_mallocN(256*sizeof(short), "initfilt");
- mask2[a]= MEM_mallocN(256*sizeof(short), "initfilt");
fmask1[a]= MEM_mallocN(256*sizeof(float), "initfilt");
fmask2[a]= MEM_mallocN(256*sizeof(float), "initfilt");
}
@@ -294,10 +238,8 @@ void RE_init_filt_mask(void)
}
for(a=0; a<9;a++) {
- memset(mask1[a], 0, 256*2);
- memset(mask2[a], 0, 256*2);
- memset(fmask1[a], 0, 256*4);
- memset(fmask2[a], 0, 256*4);
+ memset(fmask1[a], 0, 256*sizeof(float));
+ memset(fmask2[a], 0, 256*sizeof(float));
}
/* calculate totw */
@@ -315,60 +257,41 @@ void RE_init_filt_mask(void)
memset(weight, 0, sizeof(weight));
calc_weight(weight, i, j);
- for(a=0; a<16; a++) shweight[a]= weight[a]*(65535.0/totw);
for(a=0; a<16; a++) flweight[a]= weight[a]*(1.0/totw);
- m1= mask1[ 3*(j+1)+i+1 ];
- m2= mask2[ 3*(j+1)+i+1 ];
m3= fmask1[ 3*(j+1)+i+1 ];
m4= fmask2[ 3*(j+1)+i+1 ];
for(a=0; a<256; a++) {
if(a & 1) {
- m1[a]+= shweight[0];
- m2[a]+= shweight[8];
m3[a]+= flweight[0];
m4[a]+= flweight[8];
}
if(a & 2) {
- m1[a]+= shweight[1];
- m2[a]+= shweight[9];
m3[a]+= flweight[1];
m4[a]+= flweight[9];
}
if(a & 4) {
- m1[a]+= shweight[2];
- m2[a]+= shweight[10];
m3[a]+= flweight[2];
m4[a]+= flweight[10];
}
if(a & 8) {
- m1[a]+= shweight[3];
- m2[a]+= shweight[11];
m3[a]+= flweight[3];
m4[a]+= flweight[11];
}
if(a & 16) {
- m1[a]+= shweight[4];
- m2[a]+= shweight[12];
m3[a]+= flweight[4];
m4[a]+= flweight[12];
}
if(a & 32) {
- m1[a]+= shweight[5];
- m2[a]+= shweight[13];
m3[a]+= flweight[5];
m4[a]+= flweight[13];
}
if(a & 64) {
- m1[a]+= shweight[6];
- m2[a]+= shweight[14];
m3[a]+= flweight[6];
m4[a]+= flweight[14];
}
if(a & 128) {
- m1[a]+= shweight[7];
- m2[a]+= shweight[15];
m3[a]+= flweight[7];
m4[a]+= flweight[15];
}
@@ -452,13 +375,11 @@ void RE_init_filt_mask(void)
}
}
-void RE_free_filt_mask()
+static void free_filt_mask()
{
int a;
for(a=0; a<9; a++) {
- MEM_freeN(mask1[a]);
- MEM_freeN(mask2[a]);
MEM_freeN(fmask1[a]);
MEM_freeN(fmask2[a]);
}
@@ -469,9 +390,9 @@ void RE_free_filt_mask()
MEM_freeN(centmask);
}
-/* add stuff */
-
+/* unused */
+#if 0
void defaultlamp()
{
LampRen *lar;
@@ -489,8 +410,60 @@ void defaultlamp()
lar->b= 1.0;
lar->lay= 65535;
}
+#endif
+
+
+
+/* ********************* init calls *********************** */
+static void init_def_material(void)
+{
+ Material *ma;
+
+ ma= &defmaterial;
+
+ init_material(&defmaterial);
+
+ init_render_material(ma);
+}
+
+void RE_init_render_data(void)
+{
+ memset(&R, 0, sizeof(RE_Render));
+
+ R.blove= (VertRen **)MEM_callocN(sizeof(void *)*(TABLEINITSIZE),"Blove");
+ R.blovl= (VlakRen **)MEM_callocN(sizeof(void *)*(TABLEINITSIZE),"Blovl");
+ R.bloha= (HaloRen **)MEM_callocN(sizeof(void *)*(TABLEINITSIZE),"Bloha");
+ R.la= (LampRen **)MEM_mallocN(LAMPINITSIZE*sizeof(void *),"renderlamparray");
+
+ init_def_material();
+ init_filt_mask();
+}
+
+void RE_free_render_data()
+{
+ MEM_freeN(R.blove);
+ R.blove= NULL;
+ MEM_freeN(R.blovl);
+ R.blovl= NULL;
+ MEM_freeN(R.bloha);
+ R.bloha= NULL;
+ MEM_freeN(R.la);
+ R.la= NULL;
+ if(R.rectot) MEM_freeN(R.rectot);
+ if(R.rectftot) MEM_freeN(R.rectftot);
+ if(R.rectz) MEM_freeN(R.rectz);
+ if(R.rectspare) MEM_freeN(R.rectspare);
+ R.rectot= NULL;
+ R.rectftot= NULL;
+ R.rectz= NULL;
+ R.rectspare= NULL;
+
+ end_render_material(&defmaterial);
+ free_filt_mask();
+}
+
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
void RE_make_existing_file(char *name)
@@ -601,13 +574,41 @@ void RE_setwindowclip(int mode, int jmode)
/* ~~~~~~~~~~~~~~~~ PARTS ~~~~~~~~~~~~~~~~~~~~~~ */
-#define PART_EMPTY -2
+/**
+* Part as in part-rendering. An image rendered in parts is rendered
+* to a list of parts, with x,y size, and a pointer to the render
+* output stored per part. Internal!
+*/
+typedef struct Part
+{
+ struct Part *next, *prev;
+ unsigned int *rect; // color 4x8 bits
+ float *rectf; // color 4x32 bits
+ unsigned int *rectz; // zbuffer
+
+ short minx, miny, maxx, maxy, x, y;
+} Part;
+
+static void freeparts(void)
+{
+ Part *part= R.parts.first;
+ while(part) {
+ if(part->rect) MEM_freeN(part->rect);
+ if(part->rectz) MEM_freeN(part->rectz);
+ if(part->rectf) MEM_freeN(part->rectf);
+ part= part->next;
+ }
+ BLI_freelistN(&R.parts);
+}
-void initparts()
+static void initparts(void)
{
+ Part *pa;
short nr, xd, yd, xpart, ypart, xparts, yparts;
short a, xminb, xmaxb, yminb, ymaxb;
+ freeparts();
+
if(R.r.mode & R_BORDER) {
xminb= R.r.border.xmin*R.rectx;
xmaxb= R.r.border.xmax*R.rectx;
@@ -629,9 +630,6 @@ void initparts()
xparts= R.r.xparts; /* for border */
yparts= R.r.yparts;
- for(nr=0;nr<xparts*yparts;nr++)
- allparts[nr][0]= PART_EMPTY; /* clear array */
-
xpart= R.rectx/xparts;
ypart= R.recty/yparts;
@@ -645,82 +643,108 @@ void initparts()
xpart= (xmaxb-xminb)/xparts;
ypart= (ymaxb-yminb)/yparts;
}
-
+
for(nr=0; nr<xparts*yparts; nr++) {
-
+ pa= MEM_callocN(sizeof(Part), "new part");
+
if(R.r.mode & R_PANORAMA) {
- allparts[nr][0]= 0;
- allparts[nr][1]= 0;
- allparts[nr][2]= R.rectx;
- allparts[nr][3]= R.recty;
+ pa->minx= pa->miny= 0;
+ pa->maxx= pa->x= R.rectx;
+ pa->maxy= pa->y= R.recty;
}
else {
xd= (nr % xparts);
yd= (nr-xd)/xparts;
- allparts[nr][0]= xminb+ xd*xpart;
- allparts[nr][1]= yminb+ yd*ypart;
- if(xd<R.r.xparts-1) allparts[nr][2]= allparts[nr][0]+xpart;
- else allparts[nr][2]= xmaxb;
- if(yd<R.r.yparts-1) allparts[nr][3]= allparts[nr][1]+ypart;
- else allparts[nr][3]= ymaxb;
+ pa->minx= xminb+ xd*xpart;
+ pa->miny= yminb+ yd*ypart;
+ if(xd<R.r.xparts-1) pa->maxx= pa->minx+xpart;
+ else pa->maxx= xmaxb;
+ if(yd<R.r.yparts-1) pa->maxy= pa->miny+ypart;
+ else pa->maxy= ymaxb;
- if(allparts[nr][2]-allparts[nr][0]<=0) allparts[nr][0]= PART_EMPTY;
- if(allparts[nr][3]-allparts[nr][1]<=0) allparts[nr][0]= PART_EMPTY;
-
- /* gauss needs 1 pixel extra to work */
+ pa->x= pa->maxx-pa->minx;
+ pa->y= pa->maxy-pa->miny;
+ }
+
+ if(pa->x>0 && pa->y>0) {
+ /* Gauss needs 1 pixel extra to work */
if(xparts*yparts>1 && (R.r.mode & R_GAUSS)) {
- allparts[nr][0]-= 1;
- allparts[nr][1]-= 1;
- allparts[nr][2]+= 1;
- allparts[nr][3]+= 1;
+ pa->minx-= 1;
+ pa->miny-= 1;
+ pa->maxx+= 1;
+ pa->maxy+= 1;
+ pa->x+= 2;
+ pa->y+= 2;
}
+ BLI_addtail(&R.parts, pa);
}
+ else MEM_freeN(pa);
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-short setpart(short nr) /* return 0 if incorrect part */
+static void setpart(Part *pa)
{
- if(allparts[nr][0]== PART_EMPTY) return 0;
-
- R.xstart= allparts[nr][0]-R.afmx;
- R.ystart= allparts[nr][1]-R.afmy;
- R.xend= allparts[nr][2]-R.afmx;
- R.yend= allparts[nr][3]-R.afmy;
- R.rectx= R.xend-R.xstart;
- R.recty= R.yend-R.ystart;
-
- return 1;
+ R.xstart= pa->minx-R.afmx;
+ R.ystart= pa->miny-R.afmy;
+ R.xend= pa->maxx-R.afmx;
+ R.yend= pa->maxy-R.afmy;
+ R.rectx= pa->x;
+ R.recty= pa->y;
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-void addparttorect(short nr, Part *part)
+static void addparttorect(Part *pa)
{
- unsigned int *rt, *rp;
+ float *rf, *rfp;
+ unsigned int *rt, *rtp, *rz, *rzp;
int y, heigth, len, copylen;
- /* the right offset in rectot */
+ /* calc the right offset in rects, zbuffer cannot exist... */
- rp= part->rect;
- copylen=len= (allparts[nr][2]-allparts[nr][0]);
- heigth= (allparts[nr][3]-allparts[nr][1]);
+ rtp= pa->rect;
+ rzp= pa->rectz;
+ rfp= pa->rectf;
+
+ copylen=len= pa->x;
+ heigth= pa->y;
if(R.r.mode & R_GAUSS) {
- rp+= 1+len;
+
+ rtp+= 1+len;
+ if(rzp) rzp+= 1+len;
+ if(rfp) rfp+= 4*(1+len);
+
copylen= len-2;
heigth -= 2;
- rt= R.rectot+ (allparts[nr][1] + 1)*R.rectx+ (allparts[nr][0]+1);
+ rt= R.rectot+ (pa->miny + 1)*R.rectx+ (pa->minx+1);
+ rz= R.rectz+ (pa->miny + 1)*R.rectx+ (pa->minx+1);
+ rf= R.rectftot+ 4*( (pa->miny + 1)*R.rectx + (pa->minx+1) );
+ }
+ else {
+ rt= R.rectot+ pa->miny*R.rectx+ pa->minx;
+ rz= R.rectz+ pa->miny*R.rectx+ pa->minx;
+ rf= R.rectftot+ 4*(pa->miny*R.rectx+ pa->minx);
}
- else rt= R.rectot+ allparts[nr][1]*R.rectx+ allparts[nr][0];
-
for(y=0; y<heigth; y++) {
- memcpy(rt, rp, 4*copylen);
+ memcpy(rt, rtp, 4*copylen);
rt+= R.rectx;
- rp+= len;
+ rtp+= len;
+
+ if(rzp) {
+ memcpy(rz, rzp, 4*copylen);
+ rz+= R.rectx;
+ rzp+= len;
+ }
+ if(rfp) {
+ memcpy(rf, rfp, 16*copylen);
+ rf+= 4*R.rectx;
+ rfp+= 4*len;
+ }
}
}
@@ -728,7 +752,7 @@ void addparttorect(short nr, Part *part)
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-void add_to_blurbuf(int blur)
+static void add_to_blurbuf(int blur)
{
static unsigned int *blurrect= 0;
int tot, gamval;
@@ -797,7 +821,7 @@ void yafrayRender()
R.flag |= R_RENDERING; /* !!! */
if (R.rectz) MEM_freeN(R.rectz);
- R.rectz = 0;
+ R.rectz = NULL;
// switch must be done before prepareScene()
if (!R.r.YFexportxml)
@@ -815,39 +839,70 @@ void yafrayRender()
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-void render() {
- /* yafray: render, see above */
- if (R.r.renderer==R_YAFRAY)
- yafrayRender();
- else
- oldRenderLoop();
-}
+
+// exported to other files, belongs in include... later
+SDL_mutex *render_abuf_lock=NULL, *load_ibuf_lock=NULL;
-void oldRenderLoop(void) /* here the PART and FIELD loops */
+static void renderloop_setblending(void)
{
- Part *part;
- unsigned int *rt, *rt1, *rt2;
- int len, y;
- short blur, a,fields,fi,parts; /* pa is a global because of print */
+
+ /* this value should only be set here. do_gamma is for gammablended adding of subpixels */
+ do_gamma= 0;
+ if(R.r.mode & R_GAMMA) {
+ if((R.r.mode & R_OSA)) do_gamma= 1;
+ }
+
+ /* always call, it does gamma tables used by alphaunder, but call after R.osa and jit was set */
+ init_filt_mask();
+
+ switch (R.r.alphamode) {
+ case R_ALPHAKEY:
+ setSkyBlendingMode(RE_ALPHA_KEY);
+ break;
+ case R_ALPHAPREMUL:
+ setSkyBlendingMode(RE_ALPHA_PREMUL);
+ break;
+ default:
+ setSkyBlendingMode(RE_ALPHA_SKY);
+ }
+
+ /* SHould use slider when the gamma button is pressed. */
+ if (do_gamma) {
+ makeGammaTables(2.0);
+ } else {
+ makeGammaTables(1.0);
+ }
+
+}
- if (R.rectz) MEM_freeN(R.rectz);
- R.rectz = 0;
+static void mainRenderLoop(void) /* here the PART and FIELD loops */
+{
+ Part *pa;
+ int blur, fields, fi, totparts, nr;
+
+ /* create mutexes for threaded render */
+ render_abuf_lock = SDL_CreateMutex();
+ load_ibuf_lock = SDL_CreateMutex();
+ if(R.rectz) MEM_freeN(R.rectz);
+ R.rectz = NULL;
+ if(R.rectftot) MEM_freeN(R.rectftot);
+ R.rectftot = NULL;
+
/* FIELD LOOP */
+ totparts= R.r.xparts*R.r.yparts;
fields= 1;
- parts= R.r.xparts*R.r.yparts;
if(R.r.mode & R_FIELDS) {
fields= 2;
- R.rectf1= R.rectf2= 0; /* field rects */
+ R.rectf1= R.rectf2= NULL; /* field rects */
R.r.ysch/= 2;
R.afmy/= 2;
R.r.yasp*= 2;
R.ycor= ( (float)R.r.yasp)/( (float)R.r.xasp);
}
-
for(fi=0; fi<fields; fi++) {
@@ -874,7 +929,7 @@ void oldRenderLoop(void) /* here the PART and FIELD loops */
if(R.r.mode & R_MBLUR) set_mblur_offs(R.osa-blur);
initparts(); /* always do, because of border */
- setpart(0);
+ setpart(R.parts.first);
RE_local_init_render_display();
RE_local_clear_render_display(R.win);
@@ -882,20 +937,18 @@ void oldRenderLoop(void) /* here the PART and FIELD loops */
prepareScene();
- /* PARTS */
- R.parts.first= R.parts.last= 0;
- for(pa=0; pa<parts; pa++) {
+ /* PARTS LOOP */
+ nr= 0;
+ for(pa= R.parts.first; pa; pa= pa->next, nr++) {
if(RE_local_test_break()) break;
- if(pa) { /* because case pa==0 has been done */
- if(setpart(pa)==0) break;
- }
+ setpart(pa);
if(R.r.mode & R_MBLUR) RE_setwindowclip(0, blur);
else RE_setwindowclip(0,-1);
- if(R.r.mode & R_PANORAMA) setPanoRot(pa);
+ if(R.r.mode & R_PANORAMA) setPanoRot(nr);
/* HOMOGENIC COORDINATES AND ZBUF AND CLIP OPTIMISATION (per part) */
/* There may be some interference with z-coordinate */
@@ -903,10 +956,13 @@ void oldRenderLoop(void) /* here the PART and FIELD loops */
doClipping(RE_projectverto);
if(RE_local_test_break()) break;
-
-
+
/* rectot is for result and integer face indices */
- R.rectot= (unsigned int *)MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
+ if(R.rectot) MEM_freeN(R.rectot);
+ R.rectot= MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
+
+ if(R.rectftot) MEM_freeN(R.rectftot);
+ if(R.r.mode & R_FBUF) R.rectftot= MEM_callocN(4*sizeof(float)*R.rectx*R.recty, "rectftot");
if(R.r.mode & R_MBLUR) {
RE_local_printrenderinfo(0.0, R.osa - blur);
@@ -928,17 +984,14 @@ void oldRenderLoop(void) /* here the PART and FIELD loops */
if( (R.r.mode & R_BORDER) && (R.r.mode & R_MOVIECROP));
else {
/* HANDLE PART OR BORDER */
- if(parts>1 || (R.r.mode & R_BORDER)) {
+ if(totparts>1 || (R.r.mode & R_BORDER)) {
- part= MEM_callocN(sizeof(Part), "part");
- BLI_addtail(&R.parts, part);
- part->rect= R.rectot;
+ pa->rect= R.rectot;
R.rectot= NULL;
-
- if (R.rectz) {
- MEM_freeN(R.rectz);
- R.rectz= NULL;
- }
+ pa->rectf= R.rectftot;
+ R.rectftot= NULL;
+ pa->rectz= R.rectz;
+ R.rectz= NULL;
}
}
@@ -955,36 +1008,31 @@ void oldRenderLoop(void) /* here the PART and FIELD loops */
if(R.r.mode & R_PANORAMA) R.rectx*= R.r.xparts;
- if(parts>1 || (R.r.mode & R_BORDER)) {
+ if(totparts>1 || (R.r.mode & R_BORDER)) {
+ int a;
+
if(R.rectot) MEM_freeN(R.rectot);
+ if(R.rectftot) MEM_freeN(R.rectftot);
+ if(R.rectz) MEM_freeN(R.rectz);
- R.rectot=(unsigned int *)MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
+ R.rectot= MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
+ R.rectz= MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectz");
+ if(R.r.mode & R_FBUF) R.rectftot= MEM_callocN(4*sizeof(float)*R.rectx*R.recty, "rectftot");
+ else R.rectftot= NULL;
- part= R.parts.first;
- for(pa=0; pa<parts; pa++) {
- if(allparts[pa][0]== PART_EMPTY) break;
- if(part==0) break;
+ for(a=0, pa= R.parts.first; pa; pa= pa->next, a++) {
- if(R.r.mode & R_PANORAMA) {
- if(pa) {
- allparts[pa][0] += pa*R.r.xsch;
- allparts[pa][2] += pa*R.r.xsch;
- }
+ if(R.r.mode & R_PANORAMA) { // pano is fake parts...
+ pa->minx += a*R.r.xsch;
+ pa->maxx += a*R.r.xsch;
}
- addparttorect(pa, part);
-
- part= part->next;
- }
-
- part= R.parts.first;
- while(part) {
- MEM_freeN(part->rect);
- part= part->next;
+ addparttorect(pa);
}
- BLI_freelistN(&R.parts);
}
}
-
+
+ freeparts();
+
if( (R.flag & R_HALO)) {
if(RE_local_test_break()==0) add_halo_flare();
}
@@ -1006,7 +1054,7 @@ void oldRenderLoop(void) /* here the PART and FIELD loops */
if(R.r.mode & R_FIELDS) {
if(R.flag & R_SEC_FIELD) R.rectf2= R.rectot;
else R.rectf1= R.rectot;
- R.rectot= 0;
+ R.rectot= NULL;
}
if(RE_local_test_break()) break;
@@ -1021,8 +1069,11 @@ void oldRenderLoop(void) /* here the PART and FIELD loops */
if(R.rectot) MEM_freeN(R.rectot); /* happens when a render has been stopped */
R.rectot=(unsigned int *)MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
-
+
if(RE_local_test_break()==0) {
+ unsigned int *rt, *rt1, *rt2;
+ int len, a;
+
rt= R.rectot;
if(R.r.mode & R_ODDFIELD) {
@@ -1045,48 +1096,58 @@ void oldRenderLoop(void) /* here the PART and FIELD loops */
rt2+= R.rectx;
}
}
+
+ if(R.rectf1) MEM_freeN(R.rectf1);
+ R.rectf1= NULL;
+ if(R.rectf2) MEM_freeN(R.rectf2);
+ R.rectf2= NULL;
+ /* fbuf and zbuf free, image size differs now */
+ if(R.rectftot) MEM_freeN(R.rectftot);
+ R.rectftot= NULL;
+ if(R.rectz) MEM_freeN(R.rectz);
+ R.rectz= NULL;
+
}
- /* R.rectx= R.r.xsch; */
- /* if(R.r.mode & R_PANORAMA) R.rectx*= R.r.xparts; */
- /* R.recty= R.r.ysch; */
-
/* if border: still do skybuf */
if(R.r.mode & R_BORDER) {
if( (R.r.mode & R_MOVIECROP)==0) {
if(R.r.bufflag & 1) {
+ unsigned int *rt;
+ int x, y;
+
R.xstart= -R.afmx;
R.ystart= -R.afmy;
rt= R.rectot;
- for(y=0; y<R.recty; y++, rt+= R.rectx) scanlinesky((char *)rt, y);
+ for(y=0; y<R.recty; y++) {
+ for(x=0; x<R.rectx; x++, rt++) {
+ if(*rt==0) fillBackgroundImageChar((char *)rt, x, y);
+ }
+ }
}
}
}
set_mblur_offs(0);
- /* FREE */
-
- /* zbuf test */
-
- /* don't free R.rectz, only when its size is not the same as R.rectot */
-
- if (R.rectz && parts == 1 && (R.r.mode & R_FIELDS) == 0);
- else {
- if(R.rectz) MEM_freeN(R.rectz);
- R.rectz= 0;
- }
-
- if(R.rectf1) MEM_freeN(R.rectf1);
- R.rectf1= 0;
- if(R.rectf2) MEM_freeN(R.rectf2);
- R.rectf2= 0;
+ /* mutexes free */
+ SDL_DestroyMutex(load_ibuf_lock);
+ SDL_DestroyMutex(render_abuf_lock);
+ load_ibuf_lock= NULL;
+ render_abuf_lock= NULL;
}
+void render() {
+ /* yafray: render, see above */
+ if (R.r.renderer==R_YAFRAY)
+ yafrayRender();
+ else
+ mainRenderLoop();
+}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-extern unsigned short usegamtab;
+
void RE_initrender(struct View3D *ogl_render_view3d)
{
double start_time;
@@ -1163,23 +1224,16 @@ void RE_initrender(struct View3D *ogl_render_view3d)
}
}
- usegamtab= 0; /* see also further */
-
if(R.r.mode & (R_OSA|R_MBLUR)) {
R.osa= R.r.osa;
if(R.osa>16) R.osa= 16;
init_render_jit(R.osa);
- /* this value sometimes is reset temporally, for example in transp zbuf */
- if(R.r.mode & R_GAMMA) {
- if((R.r.mode & R_OSA)) usegamtab= 1;
- }
}
else R.osa= 0;
- /* always call, it does gamma tables used by alphaunder, but call after R.osa and jit was set */
- RE_init_filt_mask();
+ renderloop_setblending(); // alpha, sky, gamma
/* when rendered without camera object */
/* it has to done here because of envmaps */
@@ -1205,14 +1259,15 @@ void RE_initrender(struct View3D *ogl_render_view3d)
if(R.rectot) MEM_freeN(R.rectot);
R.rectot= (unsigned int *)MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
+ if(R.rectftot) MEM_freeN(R.rectftot);
+ R.rectftot= NULL;
+
RE_local_timecursor((G.scene->r.cfra));
if(RE_local_test_break()==0) do_render_seq();
/* display */
- if(R.rectot) RE_local_render_display(0, R.recty-1,
- R.rectx, R.recty,
- R.rectot);
+ if(R.rectot) RE_local_render_display(0, R.recty-1, R.rectx, R.recty,R.rectot);
}
else if(R.r.scemode & R_OGL) {
R.rectx= R.r.xsch;
@@ -1221,6 +1276,9 @@ void RE_initrender(struct View3D *ogl_render_view3d)
if(R.rectot) MEM_freeN(R.rectot);
R.rectot= (unsigned int *)MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
+ if(R.rectftot) MEM_freeN(R.rectftot);
+ R.rectftot= NULL;
+
RE_local_init_render_display();
drawview3d_render(ogl_render_view3d);
}
@@ -1232,8 +1290,11 @@ void RE_initrender(struct View3D *ogl_render_view3d)
if(G.scene->camera==0) {
error("No camera");
/* needed because R.rectx and R.recty can be unmatching R.rectot */
+
if(R.rectot) MEM_freeN(R.rectot);
R.rectot= NULL;
+ if(R.rectftot) MEM_freeN(R.rectftot);
+ R.rectftot= NULL;
G.afbreek=1;
return;
@@ -1252,22 +1313,16 @@ void RE_initrender(struct View3D *ogl_render_view3d)
/* display again: fields/seq/parts/pano etc */
if(R.rectot) {
RE_local_init_render_display();
- RE_local_render_display(0, R.recty-1,
- R.rectx, R.recty,
- R.rectot);
+ RE_local_render_display(0, R.recty-1, R.rectx, R.recty, R.rectot);
}
else RE_local_clear_render_display(R.win);
if ((G.scene->r.scemode & R_OGL)==0) /* header gets scrabled if renderwindow holds OGL context */
RE_local_printrenderinfo((PIL_check_seconds_timer() - start_time), -1);
- /* restore variables */
- //R.osatex= 0;
- //R.vlr= 0;
- ///* at cubemap */
/* these flags remain on, until reset in caller to render (renderwin.c) */
- R.flag &= (R_RENDERING|R_ANIMRENDER);
+ R.flag &= (R_RENDERING|R_ANIMRENDER|R_REDRAW_PRV);
}
void RE_animrender(struct View3D *ogl_render_view3d)
@@ -1285,8 +1340,7 @@ void RE_animrender(struct View3D *ogl_render_view3d)
if(G.scene->r.scemode & R_OGL) R.r.mode &= ~R_PANORAMA;
- // these calculations apply for
- // all movie formats
+ // these calculations apply for all movie formats
R.rectx= (R.r.size*R.r.xsch)/100;
R.recty= (R.r.size*R.r.ysch)/100;
if(R.r.mode & R_PANORAMA) {
@@ -1295,7 +1349,7 @@ void RE_animrender(struct View3D *ogl_render_view3d)
}
if(R.r.mode & R_MOVIECROP) {
initparts();
- setpart(0); // this will adjust r.rectx
+ setpart(R.parts.first); // this will adjust r.rectx
}
if (0) {
@@ -1358,7 +1412,7 @@ void RE_animrender(struct View3D *ogl_render_view3d)
}
- (G.scene->r.cfra)= cfrao;
+ G.scene->r.cfra= cfrao;
/* restore time */
if(R.r.mode & (R_FIELDS|R_MBLUR)) {
diff --git a/source/blender/render/intern/source/jitter.c b/source/blender/render/intern/source/jitter.c
index 50f465f4932..98bb1543068 100644
--- a/source/blender/render/intern/source/jitter.c
+++ b/source/blender/render/intern/source/jitter.c
@@ -40,12 +40,8 @@
#include "BLI_arithb.h"
#include "BLI_rand.h"
#include "render.h"
-#include "render_intern.h"
#include "jitter.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
float jit[64][2];
diff --git a/source/blender/render/intern/source/pixelblending.c b/source/blender/render/intern/source/pixelblending.c
index 357be706ff9..05a5671b48f 100644
--- a/source/blender/render/intern/source/pixelblending.c
+++ b/source/blender/render/intern/source/pixelblending.c
@@ -39,13 +39,11 @@
/* global includes */
#include "render.h"
-#include "render_intern.h"
/* local includes */
#include "vanillaRenderPipe_types.h"
/* own includes */
-#include "pixelblending_types.h"
#include "pixelblending.h"
#include "gammaCorrectionTables.h"
@@ -63,6 +61,17 @@
/* blending difficulties otherwise. Be careful here. */
#define RE_ALPHA_CLIPPING
+
+
+/* Threshold for a 'full' pixel: pixels with alpha above this level are */
+/* considered opaque This is the decimal value for 0xFFF0 / 0xFFFF */
+#define RE_FULL_COLOUR_FLOAT 0.9998
+/* Threshold for an 'empty' pixel: pixels with alpha above this level are */
+/* considered completely transparent. This is the decimal value */
+/* for 0x000F / 0xFFFF */
+#define RE_EMPTY_COLOUR_FLOAT 0.0002
+
+
/* functions --------------------------------------------------------------- */
/*
@@ -103,7 +112,7 @@ void applyKeyAlphaCharCol(char* target) {
}
}
-} /* end of void applyKeyAlphaCharCol(char* target) */
+}
/* ------------------------------------------------------------------------- */
@@ -116,7 +125,7 @@ void addAddSampColF(float *sampvec, float *source, int mask, int osaNr,
if(mask & (1<<a)) addalphaAddfacFloat(sampvec, source, addfac);
sampvec+= 4;
}
-} /* end of void addAddSampColF(float, float, int, int) */
+}
/* ------------------------------------------------------------------------- */
@@ -128,7 +137,7 @@ void addOverSampColF(float *sampvec, float *source, int mask, int osaNr)
if(mask & (1<<a)) addAlphaOverFloat(sampvec, source);
sampvec+= 4;
}
-} /* end of void addOverSampColF(float, float, int, int) */
+}
/* ------------------------------------------------------------------------- */
@@ -142,35 +151,7 @@ int addUnderSampColF(float *sampvec, float *source, int mask, int osaNr)
sampvec+= 4;
}
return retval;
-} /* end of int addToSampColF(float, float, int, int) */
-
-/* ------------------------------------------------------------------------- */
-
-int addToSampCol(unsigned short *sampcol, unsigned short *shortcol, int mask, int osaNr)
-{
- int a, retval = osaNr;
-
- for(a=0; a < osaNr; a++) {
- if(mask & (1<<a)) addAlphaUnderShort(sampcol, shortcol);
- if(sampcol[3]>0xFFF0) retval--;
- sampcol+= 4;
- }
- return retval;
-} /* end of int addToSampCol(unsigned short, uhost, int, int) */
-
-/* ------------------------------------------------------------------------- */
-
-int addtosampcol(unsigned short *sampcol, unsigned short *shortcol, int mask)
-{
- int a, retval = R.osa;
-
- for(a=0; a < R.osa; a++) {
- if(mask & (1<<a)) addAlphaUnderShort(sampcol, shortcol);
- if(sampcol[3]>0xFFF0) retval--;
- sampcol+= 4;
- }
- return retval;
-} /* end of int addtosampcol(unsigned short *sampcol, unsigned short *shortcol, int mask) */
+}
/* ------------------------------------------------------------------------- */
@@ -180,12 +161,6 @@ void addAlphaOverShort(unsigned short *doel, unsigned short *bron)
unsigned int c;
unsigned int mul;
- if( doel[3]==0 || bron[3]>=0xFFF0) { /* has been tested */
- *((unsigned int *)doel)= *((unsigned int *)bron);
- *((unsigned int *)(doel+2))= *((unsigned int *)(bron+2));
- return;
- }
-
mul= 0xFFFF-bron[3];
c= ((mul*doel[0])>>16)+bron[0];
@@ -201,7 +176,7 @@ void addAlphaOverShort(unsigned short *doel, unsigned short *bron)
if(c>=0xFFF0) doel[3]=0xFFF0;
else doel[3]= c;
-} /* end of void addAlphaOverShort(unsigned short *doel, unsigned short *bron) */
+}
/* ------------------------------------------------------------------------- */
@@ -233,8 +208,8 @@ void addAlphaUnderShort(unsigned short *doel, unsigned short *bron)
if(c>=0xFFF0) doel[3]=0xFFF0;
else doel[3]= c;
-} /* end of void addAlphaUnderShort(unsigned short *doel, unsigned short *bron) */
-
+}
+
/* ------------------------------------------------------------------------- */
void addAlphaOverFloat(float *dest, float *source)
@@ -257,8 +232,7 @@ void addAlphaOverFloat(float *dest, float *source)
c= (mul*dest[3]) + source[3];
dest[3]= c;
-} /* end of void addAlphaOverFloat(float *doel, float *bron) */
-
+}
/* ------------------------------------------------------------------------- */
@@ -291,7 +265,7 @@ void addAlphaUnderFloat(float *dest, float *source)
c= (mul*source[3]) + dest[3];
dest[3]= c;
-} /* end of void addAlphaUnderFloat(float *doel, float *bron) */
+}
/* ------------------------------------------------------------------------- */
@@ -301,7 +275,7 @@ void cpShortColV2CharColV(unsigned short *source, char *dest)
dest[1] = source[1]>>8;
dest[2] = source[2]>>8;
dest[3] = source[3]>>8;
-} /* end of void cpShortColV2CharColV(unsigned short *source, char *dest) */
+}
/* ------------------------------------------------------------------------- */
void cpCharColV2ShortColV(char *source, unsigned short *dest)
@@ -310,7 +284,7 @@ void cpCharColV2ShortColV(char *source, unsigned short *dest)
dest[1] = source[1]<<8;
dest[2] = source[2]<<8;
dest[3] = source[3]<<8;
-} /* end of void cpShortColV2CharColV(char *source, unsigned short *dest) */
+}
/* ------------------------------------------------------------------------- */
@@ -320,7 +294,7 @@ void cpIntColV2CharColV(unsigned int *source, char *dest)
dest[1] = source[1]>>24;
dest[2] = source[2]>>24;
dest[3] = source[3]>>24;
-} /* end of void cpIntColV2CharColV(unsigned int *source, char *dest) */
+}
/* ------------------------------------------------------------------------- */
@@ -330,7 +304,8 @@ void cpCharColV2FloatColV(char *source, float *dest)
dest[1] = source[1]/255.0;
dest[2] = source[2]/255.0;
dest[3] = source[3]/255.0;
-} /* end of void cpCharColV2FloatColV(char *source, float *dest) */
+}
+
/* ------------------------------------------------------------------------- */
void cpShortColV2FloatColV(unsigned short *source, float *dest)
@@ -339,7 +314,7 @@ void cpShortColV2FloatColV(unsigned short *source, float *dest)
dest[1] = source[1]/65535.0;
dest[2] = source[2]/65535.0;
dest[3] = source[3]/65535.0;
-} /* end of void cpShortColV2FloatColV(char *source, float *dest) */
+}
/* ------------------------------------------------------------------------- */
@@ -362,7 +337,7 @@ void cpFloatColV2CharColV(float* source, char *dest)
else if (source[3] > 1.0) dest[3] = 255;
else dest[3] = (char) (source[3] * 255.0);
-} /* end of void cpFloatColV2CharColV(float* source, char *dest) */
+}
/* ------------------------------------------------------------------------- */
@@ -372,7 +347,7 @@ void cpShortColV(unsigned short *source, unsigned short *dest)
dest[1] = source[1];
dest[2] = source[2];
dest[3] = source[3];
-} /* end of void cpShortColV(unsigned short *source, unsigned short *dest) */
+}
/* ------------------------------------------------------------------------- */
void cpFloatColV(float *source, float *dest)
@@ -381,7 +356,7 @@ void cpFloatColV(float *source, float *dest)
dest[1] = source[1];
dest[2] = source[2];
dest[3] = source[3];
-} /* end of void cpFloatColV(float *source, float *dest) */
+}
/* ------------------------------------------------------------------------- */
@@ -391,7 +366,7 @@ void cpCharColV(char *source, char *dest)
dest[1] = source[1];
dest[2] = source[2];
dest[3] = source[3];
-} /* end of void cpCharColV(char *source, char *dest) */
+}
/* ------------------------------------------------------------------------- */
void addalphaAddfacFloat(float *dest, float *source, char addfac)
@@ -432,7 +407,7 @@ void addalphaAddfacFloat(float *dest, float *source, char addfac)
#endif
dest[3]= c;
-} /* end of void addalphaAddfacFloat(unsigned short *doel, unsigned short *bron, char addfac_help) */
+}
/* ------------------------------------------------------------------------- */
@@ -468,7 +443,7 @@ void addalphaAddfacShort(unsigned short *doel, unsigned short *bron, char addfac
if(c > 65535.0) doel[3] = 65535;
else doel[3]= floor(c);
-} /* end of void addalphaAddfacShort(unsigned short *doel, unsigned short *bron, char addfac_help) */
+}
/* ------------------------------------------------------------------------- */
@@ -520,7 +495,7 @@ void addHaloToHaloShort(unsigned short *d, unsigned short *s)
if( c[3] > 65535.0 ) d[3] = 65535; else d[3]= floor(c[3]);
-} /* end of void addHaloToHaloShort(unsigned short *dest, unsigned short *source, char addfac) */
+}
/* ------------------------------------------------------------------------- */
@@ -542,17 +517,15 @@ void sampleShortColV2ShortColV(unsigned short *sample, unsigned short *dest, int
dest[2]= intcol[2]/osaNr;
dest[3]= intcol[3]/osaNr;
-} /* end of void sampleShortColVToShortColV(unsigned short *sample, unsigned short *dest) */
-
+}
/* ------------------------------------------------------------------------- */
-float *fmask1[9], *fmask2[9];
-
/* filtered adding to scanlines */
void add_filt_fmask(unsigned int mask, float *col, float *rb1, float *rb2, float *rb3)
{
/* calc the value of mask */
+ extern float *fmask1[], *fmask2[];
float val, r, g, b, al;
unsigned int a, maskand, maskshift;
int j;
@@ -615,7 +588,7 @@ void sampleFloatColV2FloatColVFilter(float *sample, float *dest1, float *dest2,
dest2[7]= sample[3];
}
else {
- if (doGamma()) {
+ if (do_gamma) {
/* use a LUT and interpolation to do the gamma correction */
for(a=0; a < osaNr; a++, scol+=4) {
intcol[0] = gammaCorrect( (scol[0]<1.0) ? scol[0]:1.0 );
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index e1b468153f3..84416601986 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -45,6 +45,7 @@
#include "MTC_vectorops.h"
#include "DNA_camera_types.h"
+#include "DNA_material_types.h"
#include "DNA_object_types.h"
#include "DNA_image_types.h"
#include "DNA_texture_types.h"
@@ -56,11 +57,11 @@
#include "render.h"
#include "texture.h"
-#include "render_intern.h"
#include "vanillaRenderPipe_types.h"
#include "pixelblending.h"
#include "rendercore.h" /* for some shading functions... */
+#include "shadbuf.h"
#include "zbufferdatastruct.h"
#include "renderHelp.h"
@@ -69,13 +70,6 @@
#include "errorHandler.h"
#include "pixelshading.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-/* The collector is the communication channel with the render pipe. */
-extern RE_COLBUFTYPE collector[4]; /* used throughout as pixel colour accu */
/* ton:
- unified render now uses face render routines from rendercore.c
@@ -83,16 +77,15 @@ extern RE_COLBUFTYPE collector[4]; /* used throughout as pixel colour accu */
/* ------------------------------------------------------------------------- */
-void *renderPixel(float x, float y, int *obdata, int mask)
+void *renderPixel(RE_COLBUFTYPE *collector, float x, float y, int *obdata, int mask)
{
void* data = NULL;
if (obdata[3] & RE_POLY) {
- /* face pixels aren't rendered in floats yet, so we wrap it here */
data = shadepixel(x, y, obdata[1], mask, collector);
}
else if (obdata[3] & RE_HALO) {
- data = renderHaloPixel(x, y, obdata[1]);
+ data = renderHaloPixel(collector, x, y, obdata[1]);
}
else if( obdata[1] == 0 ) {
/* for lamphalo, but doesn't seem to be called? Actually it is, and */
@@ -126,7 +119,7 @@ static unsigned int calcHaloZ(HaloRen *har, unsigned int zz)
return zz;
}
-void *renderHaloPixel(float x, float y, int haloNr)
+void *renderHaloPixel(RE_COLBUFTYPE *collector, float x, float y, int haloNr)
{
HaloRen *har = NULL;
float dist = 0.0;
@@ -144,8 +137,8 @@ void *renderHaloPixel(float x, float y, int haloNr)
dist = ((x - har->xs) * (x - har->xs))
+ ((y - har->ys) * (y - har->ys) * R.ycor * R.ycor) ;
- collector[0] = RE_ZERO_COLOUR_FLOAT; collector[1] = RE_ZERO_COLOUR_FLOAT;
- collector[2] = RE_ZERO_COLOUR_FLOAT; collector[3] = RE_ZERO_COLOUR_FLOAT;
+ collector[0] = 0.0f; collector[1] = 0.0f;
+ collector[2] = 0.0f; collector[3] = 0.0f;
if (dist < har->radsq) {
shadeHaloFloat(har, collector, zz, dist,
@@ -159,14 +152,184 @@ void *renderHaloPixel(float x, float y, int haloNr)
/* ------------------------------------------------------------------------- */
extern float hashvectf[];
-void shadeHaloFloat(HaloRen *har,
- float *col, unsigned int zz,
- float dist, float xn,
- float yn, short flarec)
+
+static void render_lighting_halo(HaloRen *har, float *colf)
+{
+ LampRen *lar;
+ float i, inp, inpr, rco[3], dco[3], lv[3], lampdist, ld, t, *vn;
+ float ir, ig, ib, shadfac, soft, lacol[3];
+ int a;
+
+ ir= ig= ib= 0.0;
+
+ VECCOPY(rco, har->co);
+ dco[0]=dco[1]=dco[2]= 1.0/har->rad;
+
+ vn= har->no;
+
+ for(a=0; a<R.totlamp; a++) {
+ lar= R.la[a];
+
+ /* test for lamplayer */
+ if(lar->mode & LA_LAYER) if((lar->lay & har->lay)==0) continue;
+
+ /* lampdist cacluation */
+ if(lar->type==LA_SUN || lar->type==LA_HEMI) {
+ VECCOPY(lv, lar->vec);
+ lampdist= 1.0;
+ }
+ else {
+ lv[0]= rco[0]-lar->co[0];
+ lv[1]= rco[1]-lar->co[1];
+ lv[2]= rco[2]-lar->co[2];
+ ld= sqrt(lv[0]*lv[0]+lv[1]*lv[1]+lv[2]*lv[2]);
+ lv[0]/= ld;
+ lv[1]/= ld;
+ lv[2]/= ld;
+
+ /* ld is re-used further on (texco's) */
+
+ if(lar->mode & LA_QUAD) {
+ t= 1.0;
+ if(lar->ld1>0.0)
+ t= lar->dist/(lar->dist+lar->ld1*ld);
+ if(lar->ld2>0.0)
+ t*= lar->distkw/(lar->distkw+lar->ld2*ld*ld);
+
+ lampdist= t;
+ }
+ else {
+ lampdist= (lar->dist/(lar->dist+ld));
+ }
+
+ if(lar->mode & LA_SPHERE) {
+ t= lar->dist - ld;
+ if(t<0.0) continue;
+
+ t/= lar->dist;
+ lampdist*= (t);
+ }
+
+ }
+
+ lacol[0]= lar->r;
+ lacol[1]= lar->g;
+ lacol[2]= lar->b;
+
+ if(lar->mode & LA_TEXTURE) {
+ ShadeInput shi;
+ VECCOPY(shi.co, rco);
+ shi.osatex= 0;
+ do_lamp_tex(lar, lv, &shi, lacol);
+ }
+
+ if(lar->type==LA_SPOT) {
+
+ if(lar->mode & LA_SQUARE) {
+ if(lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2]>0.0) {
+ float x, lvrot[3];
+
+ /* rotate view to lampspace */
+ VECCOPY(lvrot, lv);
+ MTC_Mat3MulVecfl(lar->imat, lvrot);
+
+ x= MAX2(fabs(lvrot[0]/lvrot[2]) , fabs(lvrot[1]/lvrot[2]));
+ /* 1.0/(sqrt(1+x*x)) is equivalent to cos(atan(x)) */
+
+ inpr= 1.0/(sqrt(1.0+x*x));
+ }
+ else inpr= 0.0;
+ }
+ else {
+ inpr= lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2];
+ }
+
+ t= lar->spotsi;
+ if(inpr<t) continue;
+ else {
+ t= inpr-t;
+ i= 1.0;
+ soft= 1.0;
+ if(t<lar->spotbl && lar->spotbl!=0.0) {
+ /* soft area */
+ i= t/lar->spotbl;
+ t= i*i;
+ soft= (3.0*t-2.0*t*i);
+ inpr*= soft;
+ }
+ if(lar->mode & LA_ONLYSHADOW) {
+ /* if(ma->mode & MA_SHADOW) { */
+ /* dot product positive: front side face! */
+ inp= vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2];
+ if(inp>0.0) {
+ /* testshadowbuf==0.0 : 100% shadow */
+ shadfac = testshadowbuf(lar->shb, rco, dco, dco, inp);
+ if( shadfac>0.0 ) {
+ shadfac*= inp*soft*lar->energy;
+ ir -= shadfac;
+ ig -= shadfac;
+ ib -= shadfac;
+
+ continue;
+ }
+ }
+ /* } */
+ }
+ lampdist*=inpr;
+ }
+ if(lar->mode & LA_ONLYSHADOW) continue;
+
+ }
+
+ /* dot product and reflectivity*/
+
+ inp= 1.0-fabs(vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2]);
+
+ /* inp= cos(0.5*M_PI-acos(inp)); */
+
+ i= inp;
+
+ if(lar->type==LA_HEMI) {
+ i= 0.5*i+0.5;
+ }
+ if(i>0.0) {
+ i*= lampdist;
+ }
+
+ /* shadow */
+ if(i> -0.41) { /* heuristic valua! */
+ shadfac= 1.0;
+ if(lar->shb) {
+ shadfac = testshadowbuf(lar->shb, rco, dco, dco, inp);
+ if(shadfac==0.0) continue;
+ i*= shadfac;
+ }
+ }
+
+ if(i>0.0) {
+ ir+= i*lacol[0];
+ ig+= i*lacol[1];
+ ib+= i*lacol[2];
+ }
+ }
+
+ if(ir<0.0) ir= 0.0;
+ if(ig<0.0) ig= 0.0;
+ if(ib<0.0) ib= 0.0;
+
+ colf[0]*= ir;
+ colf[1]*= ig;
+ colf[2]*= ib;
+
+}
+
+
+
+void shadeHaloFloat(HaloRen *har, float *col, unsigned int zz,
+ float dist, float xn, float yn, short flarec)
{
/* fill in col */
- /* migrate: fill collector */
- float t, zn, radist, ringf=0.0, linef=0.0, alpha, si, co, colf[4];
+ float t, zn, radist, ringf=0.0, linef=0.0, alpha, si, co;
int a;
if(R.wrld.mode & WO_MIST) {
@@ -306,59 +469,53 @@ void shadeHaloFloat(HaloRen *har,
/* The colour is either the rgb spec-ed by the user, or extracted from */
/* the texture */
if(har->tex) {
- colf[0]= har->r; colf[1]= har->g; colf[2]= har->b;
- colf[3]= dist;
- do_halo_tex(har, xn, yn, colf);
- colf[0]*= colf[3];
- colf[1]*= colf[3];
- colf[2]*= colf[3];
+ col[0]= har->r;
+ col[1]= har->g;
+ col[2]= har->b;
+ col[3]= dist;
+
+ do_halo_tex(har, xn, yn, col);
+
+ col[0]*= col[3];
+ col[1]*= col[3];
+ col[2]*= col[3];
}
else {
- colf[0]= dist*har->r;
- colf[1]= dist*har->g;
- colf[2]= dist*har->b;
- if(har->type & HA_XALPHA) colf[3]= dist*dist;
- else colf[3]= dist;
+ col[0]= dist*har->r;
+ col[1]= dist*har->g;
+ col[2]= dist*har->b;
+ if(har->type & HA_XALPHA) col[3]= dist*dist;
+ else col[3]= dist;
}
if(har->mat && har->mat->mode & MA_HALO_SHADE) {
/* we test for lights because of preview... */
- if(R.totlamp) render_lighting_halo(har, colf);
+ if(R.totlamp) render_lighting_halo(har, col);
}
- /* Next, we do the line and ring factor modifications. It seems we do */
- /* uchar calculations, but it's basically doing float arith with a 255 */
- /* scale factor. */
+ /* Next, we do the line and ring factor modifications. */
if(linef!=0.0) {
Material *ma= har->mat;
- colf[0]+= 255.0*linef * ma->specr;
- colf[1]+= 255.0*linef * ma->specg;
- colf[2]+= 255.0*linef * ma->specb;
+ col[0]+= linef * ma->specr;
+ col[1]+= linef * ma->specg;
+ col[2]+= linef * ma->specb;
- if(har->type & HA_XALPHA) colf[3]+= linef*linef;
- else colf[3]+= linef;
+ if(har->type & HA_XALPHA) col[3]+= linef*linef;
+ else col[3]+= linef;
}
if(ringf!=0.0) {
Material *ma= har->mat;
- colf[0]+= 255.0*ringf * ma->mirr;
- colf[1]+= 255.0*ringf * ma->mirg;
- colf[2]+= 255.0*ringf * ma->mirb;
+ col[0]+= ringf * ma->mirr;
+ col[1]+= ringf * ma->mirg;
+ col[2]+= ringf * ma->mirb;
- if(har->type & HA_XALPHA) colf[3]+= ringf*ringf;
- else colf[3]+= ringf;
+ if(har->type & HA_XALPHA) col[3]+= ringf*ringf;
+ else col[3]+= ringf;
}
-
- /* convert to [0.0; 1.0] range */
- col[0] = colf[0] / 255.0;
- col[1] = colf[1] / 255.0;
- col[2] = colf[2] / 255.0;
- col[3] = colf[3];
-
-} /* end of shadeHaloFloat() */
-
+}
/* ------------------------------------------------------------------------- */
/*
@@ -390,7 +547,7 @@ enum RE_SkyAlphaBlendingType getSkyBlendingMode() {
}
/* This one renders into collector, as always. */
-void renderSkyPixelFloat(float x, float y)
+void renderSkyPixelFloat(RE_COLBUFTYPE *collector, float x, float y)
{
switch (keyingType) {
@@ -418,7 +575,7 @@ void renderSkyPixelFloat(float x, float y)
break;
case RE_ALPHA_SKY:
/* Fill in the sky as if it were a normal face. */
- shadeSkyPixel(x, y);
+ shadeSkyPixel(collector, x, y);
collector[3]= 0.0;
break;
default:
@@ -431,9 +588,9 @@ void renderSkyPixelFloat(float x, float y)
/*
Stuff the sky colour into the collector.
*/
-void shadeSkyPixel(float fx, float fy)
+void shadeSkyPixel(RE_COLBUFTYPE *collector, float fx, float fy)
{
- float view[3];
+ float view[3], dxyview[2];
/*
The rules for sky:
@@ -445,7 +602,7 @@ void shadeSkyPixel(float fx, float fy)
/* 1. Do a backbuffer image: */
if(R.r.bufflag & 1) {
- if(R.backbuf) fillBackgroundImage(fx, fy);
+ if(R.backbuf) fillBackgroundImage(collector, fx, fy);
return;
} else if((R.wrld.skytype & (WO_SKYBLEND+WO_SKYTEX))==0) {
/*
@@ -458,7 +615,7 @@ void shadeSkyPixel(float fx, float fy)
collector[0] = R.wrld.horr;
collector[1] = R.wrld.horg;
collector[2] = R.wrld.horb;
- collector[3] = RE_UNITY_COLOUR_FLOAT;
+ collector[3] = 1.0f;
} else {
/*
3. Which type(s) is(are) this (these)? This has to be done when no simple
@@ -486,8 +643,8 @@ void shadeSkyPixel(float fx, float fy)
fac= Normalise(view);
if(R.wrld.skytype & WO_SKYTEX) {
- O.dxview= 1.0/fac;
- O.dyview= R.ycor/fac;
+ dxyview[0]= 1.0/fac;
+ dxyview[1]= R.ycor/fac;
}
}
@@ -504,16 +661,15 @@ void shadeSkyPixel(float fx, float fy)
}
/* get sky colour in the collector */
- shadeSkyPixelFloat(fy, view);
+ shadeSkyPixelFloat(collector, view, dxyview);
+ collector[3] = 1.0f;
}
-
-
}
-/* Only line number is important here. Result goes to collector[4] */
-void shadeSkyPixelFloat(float y, float *view)
+/* Only view vector is important here. Result goes to colf[3] */
+void shadeSkyPixelFloat(float *colf, float *view, float *dxyview)
{
- float lo[3];
+ float lo[3], zen[3], hor[3], blend, blendm;
/* Why is this setting forced? Seems silly to me. It is tested in the texture unit. */
R.wrld.skytype |= WO_ZENUP;
@@ -521,19 +677,22 @@ void shadeSkyPixelFloat(float y, float *view)
/* Some view vector stuff. */
if(R.wrld.skytype & WO_SKYREAL) {
- R.inprz= view[0]*R.grvec[0]+ view[1]*R.grvec[1]+ view[2]*R.grvec[2];
+ blend= view[0]*R.grvec[0]+ view[1]*R.grvec[1]+ view[2]*R.grvec[2];
- if(R.inprz<0.0) R.wrld.skytype-= WO_ZENUP;
- R.inprz= fabs(R.inprz);
+ if(blend<0.0) R.wrld.skytype-= WO_ZENUP;
+ blend= fabs(blend);
}
else if(R.wrld.skytype & WO_SKYPAPER) {
- R.inprz= 0.5+ 0.5*view[1];
+ blend= 0.5+ 0.5*view[1];
}
else {
/* the fraction of how far we are above the bottom of the screen */
- R.inprz= fabs(0.5+ view[1]);
+ blend= fabs(0.5+ view[1]);
}
+ hor[0]= R.wrld.horr; hor[1]= R.wrld.horr; hor[2]= R.wrld.horb;
+ zen[0]= R.wrld.zenr; zen[1]= R.wrld.zenr; zen[2]= R.wrld.zenb;
+
/* Careful: SKYTEX and SKYBLEND are NOT mutually exclusive! If */
/* SKYBLEND is active, the texture and colour blend are added. */
if(R.wrld.skytype & WO_SKYTEX) {
@@ -545,33 +704,23 @@ void shadeSkyPixelFloat(float y, float *view)
SWAP(float, lo[1], lo[2]);
}
-
- /* sky texture? I wonder how this manages to work... */
- /* Does this communicate with R.wrld.hor{rgb}? Yes. */
- do_sky_tex(lo);
- /* internally, T{rgb} are used for communicating colours in the */
- /* texture pipe, externally, this particular routine uses the */
- /* R.wrld.hor{rgb} thingies. */
-
+ do_sky_tex(lo, dxyview, hor, zen, &blend);
}
- /* Why are this R. members? because textures need it (ton) */
- if(R.inprz>1.0) R.inprz= 1.0;
- R.inprh= 1.0-R.inprz;
+ if(blend>1.0) blend= 1.0;
+ blendm= 1.0-blend;
/* No clipping, no conversion! */
if(R.wrld.skytype & WO_SKYBLEND) {
- collector[0] = (R.inprh*R.wrld.horr + R.inprz*R.wrld.zenr);
- collector[1] = (R.inprh*R.wrld.horg + R.inprz*R.wrld.zeng);
- collector[2] = (R.inprh*R.wrld.horb + R.inprz*R.wrld.zenb);
+ colf[0] = (blendm*hor[0] + blend*zen[0]);
+ colf[1] = (blendm*hor[1] + blend*zen[1]);
+ colf[2] = (blendm*hor[2] + blend*zen[2]);
} else {
/* Done when a texture was grabbed. */
- collector[0]= R.wrld.horr;
- collector[1]= R.wrld.horg;
- collector[2]= R.wrld.horb;
+ colf[0]= hor[0];
+ colf[1]= hor[1];
+ colf[2]= hor[2];
}
-
- collector[3]= RE_UNITY_COLOUR_FLOAT;
}
@@ -583,30 +732,25 @@ void shadeSkyPixelFloat(float y, float *view)
should be really easy. I hope I understand the way ImBuf works
correctly. (nzc)
*/
-void fillBackgroundImage(float x, float y)
+void fillBackgroundImageChar(char *col, float x, float y)
{
int iy, ix;
unsigned int* imBufPtr;
- char *colSource;
/* This double check is bad... */
if (!(R.backbuf->ok)) {
/* Something went sour here... bail... */
- collector[0] = 0.0;
- collector[1] = 0.0;
- collector[2] = 0.0;
- collector[3] = 1.0;
+ col[0] = 0;
+ col[1] = 0;
+ col[2] = 0;
+ col[3] = 255;
return;
}
/* load image if not already done?*/
if(R.backbuf->ibuf==0) {
- R.backbuf->ibuf= IMB_loadiffname(R.backbuf->name, IB_rect);
- if(R.backbuf->ibuf==0) {
- /* load failed .... keep skipping */
- R.backbuf->ok= 0;
- return;
- }
+ R.backbuf->ok= 0;
+ return;
}
/* Now for the real extraction: */
@@ -629,10 +773,17 @@ void fillBackgroundImage(float x, float y)
+ (iy * R.backbuf->ibuf->x)
+ ix;
- colSource = (char*) imBufPtr;
-
- cpCharColV2FloatColV(colSource, collector);
+ *( (int *)col) = *imBufPtr;
+
+}
+void fillBackgroundImage(RE_COLBUFTYPE *collector, float x, float y)
+{
+ char col[4];
+
+ fillBackgroundImageChar(col, x, y);
+ cpCharColV2FloatColV(col, collector);
+
}
/* eof */
diff --git a/source/blender/render/intern/source/ray.c b/source/blender/render/intern/source/ray.c
index 1638bf87435..6dcf15ba606 100644
--- a/source/blender/render/intern/source/ray.c
+++ b/source/blender/render/intern/source/ray.c
@@ -45,9 +45,9 @@
#include <BLI_rand.h>
#include "render.h"
-#include "render_intern.h"
#include "rendercore.h"
#include "pixelblending.h"
+#include "pixelshading.h"
#include "jitter.h"
#include "texture.h"
@@ -74,8 +74,6 @@ typedef struct Octree {
float ocfacx,ocfacy,ocfacz;
float min[3], max[3];
int ocres;
- /* for optimize, last intersected face */
- VlakRen *vlr_last;
} Octree;
@@ -87,6 +85,9 @@ typedef struct Isect {
float ddalabda;
float col[4]; /* RGBA for shadow_tra */
int lay; /* -1 default, set for layer lamps */
+ short vlrisect; /* flag whether vlrcontr was done or not */
+ /* for optimize, last intersected face */
+ VlakRen *vlr_last;
} Isect;
typedef struct Branch
@@ -148,47 +149,36 @@ static void calc_ocval_face(float *v1, float *v2, float *v3, float *v4, short x,
}
-static void calc_ocval_ray(OcVal *ov, float x1, float y1, float z1,
- float x2, float y2, float z2)
+static void calc_ocval_ray(OcVal *ov, float xo, float yo, float zo, float *vec1, float *vec2)
{
- static float ox1, ox2, oy1, oy2, oz1, oz2;
+ int ocmin, ocmax;
- if(ov==NULL) {
- ox1= x1; ox2= x2;
- oy1= y1; oy2= y2;
- oz1= z1; oz2= z2;
+ if(vec1[0]<vec2[0]) {
+ ocmin= OCVALRES*(vec1[0] - xo);
+ ocmax= OCVALRES*(vec2[0] - xo);
+ } else {
+ ocmin= OCVALRES*(vec2[0] - xo);
+ ocmax= OCVALRES*(vec1[0] - xo);
}
- else {
- int ocmin, ocmax;
-
- if(ox1<ox2) {
- ocmin= OCVALRES*(ox1 - ((int)x1));
- ocmax= OCVALRES*(ox2 - ((int)x1));
- } else {
- ocmin= OCVALRES*(ox2 - ((int)x1));
- ocmax= OCVALRES*(ox1 - ((int)x1));
- }
- ov->ocx= BROW(ocmin, ocmax);
+ ov->ocx= BROW(ocmin, ocmax);
- if(oy1<oy2) {
- ocmin= OCVALRES*(oy1 - ((int)y1));
- ocmax= OCVALRES*(oy2 - ((int)y1));
- } else {
- ocmin= OCVALRES*(oy2 - ((int)y1));
- ocmax= OCVALRES*(oy1 - ((int)y1));
- }
- ov->ocy= BROW(ocmin, ocmax);
+ if(vec1[1]<vec2[1]) {
+ ocmin= OCVALRES*(vec1[1] - yo);
+ ocmax= OCVALRES*(vec2[1] - yo);
+ } else {
+ ocmin= OCVALRES*(vec2[1] - yo);
+ ocmax= OCVALRES*(vec1[1] - yo);
+ }
+ ov->ocy= BROW(ocmin, ocmax);
- if(oz1<oz2) {
- ocmin= OCVALRES*(oz1 - ((int)z1));
- ocmax= OCVALRES*(oz2 - ((int)z1));
- } else {
- ocmin= OCVALRES*(oz2 - ((int)z1));
- ocmax= OCVALRES*(oz1 - ((int)z1));
- }
- ov->ocz= BROW(ocmin, ocmax);
-
+ if(vec1[2]<vec2[2]) {
+ ocmin= OCVALRES*(vec1[2] - zo);
+ ocmax= OCVALRES*(vec2[2] - zo);
+ } else {
+ ocmin= OCVALRES*(vec2[2] - zo);
+ ocmax= OCVALRES*(vec1[2] - zo);
}
+ ov->ocz= BROW(ocmin, ocmax);
}
/* ************* octree ************** */
@@ -451,7 +441,7 @@ void freeoctree(void)
printf("branches %d nodes %d\n", branchcount, nodecount);
printf("raycount %d \n", raycount);
printf("ray coherent %d \n", coherent_ray);
- // printf("accepted %d rejected %d\n", accepted, rejected);
+ printf("accepted %d rejected %d\n", accepted, rejected);
}
branchcount= 0;
nodecount= 0;
@@ -483,7 +473,6 @@ void makeoctree()
/* fill main octree struct */
g_oc.ocres= R.r.ocres;
ocres2= g_oc.ocres*g_oc.ocres;
- g_oc.vlr_last= NULL;
INIT_MINMAX(g_oc.min, g_oc.max);
/* first min max octree space */
@@ -710,11 +699,8 @@ static short intersection(Isect *is)
VertRen *v1,*v2,*v3,*v4=NULL;
float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22,r0,r1,r2;
float m0, m1, m2, divdet, det1;
- static short vlrisect=0;
short ok=0;
-
- is->vlr->raycount= raycount;
-
+
v1= is->vlr->v1;
v2= is->vlr->v2;
if(is->vlr->v4) {
@@ -811,7 +797,6 @@ static short intersection(Isect *is)
/* for mirror: large faces can be filled in too often, this prevents
a face being detected too soon... */
if(is->labda > is->ddalabda) {
- is->vlr->raycount= 0;
return 0;
}
}
@@ -819,7 +804,7 @@ static short intersection(Isect *is)
/* when a shadow ray leaves a face, it can be little outside the edges of it, causing
intersection to be detected in its neighbour face */
- if(is->vlrcontr && vlrisect); // optimizing, the tests below are not needed
+ if(is->vlrcontr && is->vlrisect); // optimizing, the tests below are not needed
else if(is->labda< .1) {
VlakRen *vlr= is->vlrorig;
short de= 0;
@@ -838,10 +823,10 @@ static short intersection(Isect *is)
if(is->vlrcontr==NULL) {
is->vlrcontr= vlr;
- vlrisect= intersection2(vlr, -r0, -r1, -r2, is->start[0], is->start[1], is->start[2]);
+ is->vlrisect= intersection2(vlr, -r0, -r1, -r2, is->start[0], is->start[1], is->start[2]);
}
- if(vlrisect) return 1;
+ if(is->vlrisect) return 1;
return 0;
}
}
@@ -853,23 +838,20 @@ static short intersection(Isect *is)
}
/* check all faces in this node */
-static int testnode(Isect *is, Node *no, int x, int y, int z)
+static int testnode(Isect *is, Node *no, OcVal ocval)
{
VlakRen *vlr;
- short nr=0, ocvaldone=0;
- OcVal ocval, *ov;
+ short nr=0;
+ OcVal *ov;
if(is->mode==DDA_SHADOW) {
vlr= no->v[0];
while(vlr) {
- if(raycount != vlr->raycount) {
+ if(is->vlrorig != vlr) {
+
if(is->lay & vlr->lay) {
- if(ocvaldone==0) {
- calc_ocval_ray(&ocval, (float)x, (float)y, (float)z, 0.0, 0.0, 0.0);
- ocvaldone= 1;
- }
ov= no->ov+nr;
if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
@@ -877,7 +859,7 @@ static int testnode(Isect *is, Node *no, int x, int y, int z)
is->vlr= vlr;
if(intersection(is)) {
- g_oc.vlr_last= vlr;
+ is->vlr_last= vlr;
return 1;
}
}
@@ -904,12 +886,7 @@ static int testnode(Isect *is, Node *no, int x, int y, int z)
vlr= no->v[0];
while(vlr) {
- if(raycount != vlr->raycount) {
-
- if(ocvaldone==0) {
- calc_ocval_ray(&ocval, (float)x, (float)y, (float)z, 0.0, 0.0, 0.0);
- ocvaldone= 1;
- }
+ if(is->vlrorig != vlr) {
ov= no->ov+nr;
if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
@@ -942,81 +919,59 @@ static int testnode(Isect *is, Node *no, int x, int y, int z)
/* find the Node for the octree coord x y z */
static Node *ocread(int x, int y, int z)
{
- static int mdiff=0, xo, yo, zo;
Branch *br;
- int oc1, diff;
-
- /* outside of octree check, reset */
- if( x >= g_oc.ocres) {
- xo= g_oc.ocres; yo= g_oc.ocres; zo= g_oc.ocres;
- return NULL;
- }
+ int oc1;
- diff= (xo ^ x) | (yo ^ y) | (zo ^ z);
-
- if(diff>mdiff) {
-
- xo=x; yo=y; zo=z;
- x<<=2;
- y<<=1;
-
- br= g_oc.adrbranch[0];
-
- if(g_oc.ocres==512) {
- oc1= ((x & 1024)+(y & 512)+(z & 256))>>8;
- br= br->b[oc1];
- if(br==NULL) {
- mdiff= 255;
- return NULL;
- }
+ x<<=2;
+ y<<=1;
+
+ br= g_oc.adrbranch[0];
+
+ if(g_oc.ocres==512) {
+ oc1= ((x & 1024)+(y & 512)+(z & 256))>>8;
+ br= br->b[oc1];
+ if(br==NULL) {
+ return NULL;
}
- if(g_oc.ocres>=256) {
- oc1= ((x & 512)+(y & 256)+(z & 128))>>7;
- br= br->b[oc1];
- if(br==NULL) {
- mdiff= 127;
- return NULL;
- }
+ }
+ if(g_oc.ocres>=256) {
+ oc1= ((x & 512)+(y & 256)+(z & 128))>>7;
+ br= br->b[oc1];
+ if(br==NULL) {
+ return NULL;
}
- if(g_oc.ocres>=128) {
- oc1= ((x & 256)+(y & 128)+(z & 64))>>6;
- br= br->b[oc1];
- if(br==NULL) {
- mdiff= 63;
- return NULL;
- }
+ }
+ if(g_oc.ocres>=128) {
+ oc1= ((x & 256)+(y & 128)+(z & 64))>>6;
+ br= br->b[oc1];
+ if(br==NULL) {
+ return NULL;
}
-
- oc1= ((x & 128)+(y & 64)+(z & 32))>>5;
+ }
+
+ oc1= ((x & 128)+(y & 64)+(z & 32))>>5;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 64)+(y & 32)+(z & 16))>>4;
br= br->b[oc1];
if(br) {
-
- oc1= ((x & 64)+(y & 32)+(z & 16))>>4;
+ oc1= ((x & 32)+(y & 16)+(z & 8))>>3;
br= br->b[oc1];
if(br) {
- oc1= ((x & 32)+(y & 16)+(z & 8))>>3;
+ oc1= ((x & 16)+(y & 8)+(z & 4))>>2;
br= br->b[oc1];
if(br) {
- oc1= ((x & 16)+(y & 8)+(z & 4))>>2;
+ oc1= ((x & 8)+(y & 4)+(z & 2))>>1;
br= br->b[oc1];
if(br) {
- oc1= ((x & 8)+(y & 4)+(z & 2))>>1;
- br= br->b[oc1];
- if(br) {
- mdiff=0;
- oc1= ((x & 4)+(y & 2)+(z & 1));
- return (Node *)br->b[oc1];
- }
- else mdiff=1;
+ oc1= ((x & 4)+(y & 2)+(z & 1));
+ return (Node *)br->b[oc1];
}
- else mdiff=3;
}
- else mdiff=7;
}
- else mdiff=15;
}
- else mdiff=31;
}
+
return NULL;
}
@@ -1081,9 +1036,10 @@ static int do_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, i
static int d3dda(Isect *is)
{
Node *no;
+ OcVal ocval;
+ float vec1[3], vec2[3];
float u1,u2,ox1,ox2,oy1,oy2,oz1,oz2;
float labdao,labdax,ldx,labday,ldy,labdaz,ldz, ddalabda;
- float vec1[3], vec2[3];
int dx,dy,dz;
int xo,yo,zo,c1=0;
int ocx1,ocx2,ocy1, ocy2,ocz1,ocz2;
@@ -1092,17 +1048,15 @@ static int d3dda(Isect *is)
if(branchcount==0) return 0;
/* do this before intersect calls */
- raycount++;
- is->vlrorig->raycount= raycount;
is->vlrcontr= NULL; /* to check shared edge */
/* only for shadow! */
if(is->mode==DDA_SHADOW) {
/* check with last intersected shadow face */
- if(g_oc.vlr_last!=NULL && g_oc.vlr_last!=is->vlrorig) {
- if(is->lay & g_oc.vlr_last->lay) {
- is->vlr= g_oc.vlr_last;
+ if(is->vlr_last!=NULL && is->vlr_last!=is->vlrorig) {
+ if(is->lay & is->vlr_last->lay) {
+ is->vlr= is->vlr_last;
VECSUB(is->vec, is->end, is->start);
if(intersection(is)) return 1;
}
@@ -1143,7 +1097,7 @@ static int d3dda(Isect *is)
if(c1==0) return 0;
/* reset static variables in ocread */
- ocread(g_oc.ocres, 0, 0);
+ //ocread(g_oc.ocres, 0, 0);
/* setup 3dda to traverse octree */
ox1= (is->start[0]-g_oc.min[0])*g_oc.ocfacx;
@@ -1166,10 +1120,12 @@ static int d3dda(Isect *is)
if(ocx1==ocx2 && ocy1==ocy2 && ocz1==ocz2) {
no= ocread(ocx1, ocy1, ocz1);
if(no) {
- /* no calc, this is store */
- calc_ocval_ray(NULL, ox1, oy1, oz1, ox2, oy2, oz2);
+ /* exact intersection with node */
+ vec1[0]= ox1; vec1[1]= oy1; vec1[2]= oz1;
+ vec2[0]= ox2; vec2[1]= oy2; vec2[2]= oz2;
+ calc_ocval_ray(&ocval, (float)ocx1, (float)ocy1, (float)ocz1, vec1, vec2);
is->ddalabda= 1.0;
- if( testnode(is, no, ocx1, ocy1, ocz1) ) return 1;
+ if( testnode(is, no, ocval) ) return 1;
}
}
else {
@@ -1225,7 +1181,7 @@ static int d3dda(Isect *is)
}
xo=ocx1; yo=ocy1; zo=ocz1;
- ddalabda= MIN3(labdax,labday,labdaz);
+ labdao= ddalabda= MIN3(labdax,labday,labdaz);
vec2[0]= ox1;
vec2[1]= oy1;
@@ -1241,15 +1197,14 @@ static int d3dda(Isect *is)
/* calculate ray intersection with octree node */
VECCOPY(vec1, vec2);
- // dox,y,z is negative
+ // dox,y,z is negative
vec2[0]= ox1-ddalabda*dox;
vec2[1]= oy1-ddalabda*doy;
vec2[2]= oz1-ddalabda*doz;
- /* no calc, this is store */
- calc_ocval_ray(NULL, vec1[0], vec1[1], vec1[2], vec2[0], vec2[1], vec2[2]);
-
+ calc_ocval_ray(&ocval, (float)xo, (float)yo, (float)zo, vec1, vec2);
+
is->ddalabda= ddalabda;
- if( testnode(is, no, xo,yo,zo) ) return 1;
+ if( testnode(is, no, ocval) ) return 1;
}
labdao= ddalabda;
@@ -1319,7 +1274,7 @@ static int d3dda(Isect *is)
}
/* reached end, no intersections found */
- g_oc.vlr_last= NULL;
+ is->vlr_last= NULL;
return 0;
}
@@ -1342,7 +1297,8 @@ static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shi->vlr= vlr;
shi->mat= vlr->mat;
- shi->matren= shi->mat->ren;
+ memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); // note, keep this synced with render_types.h
+ shi->har= shi->mat->har;
/* face normal, check for flip */
l= vlr->n[0]*shi->view[0]+vlr->n[1]*shi->view[1]+vlr->n[2]*shi->view[2];
@@ -1358,10 +1314,13 @@ static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
// Osa structs we leave unchanged now
SWAP(int, osatex, shi->osatex);
+ shi->dxco[0]= shi->dxco[1]= shi->dxco[2]= 0.0;
+ shi->dyco[0]= shi->dyco[1]= shi->dyco[2]= 0.0;
+
// but, set O structs zero where it can confuse texture code
- if(shi->matren->texco & (TEXCO_NORM|TEXCO_REFL) ) {
- O.dxno[0]= O.dxno[1]= O.dxno[2]= 0.0;
- O.dyno[0]= O.dyno[1]= O.dyno[2]= 0.0;
+ if(shi->mat->texco & (TEXCO_NORM|TEXCO_REFL) ) {
+ shi->dxno[0]= shi->dxno[1]= shi->dxno[2]= 0.0;
+ shi->dyno[0]= shi->dyno[1]= shi->dyno[2]= 0.0;
}
if(vlr->v4) {
@@ -1374,26 +1333,28 @@ static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shade_input_set_coords(shi, is->u, is->v, 0, 1, 2);
}
- SWAP(int, osatex, shi->osatex);
+ // SWAP(int, osatex, shi->osatex); XXXXX!!!!
if(is->mode==DDA_SHADOW_TRA) shade_color(shi, shr);
else {
shade_lamp_loop(shi, shr);
- if(shi->matren->translucency!=0.0) {
+ if(shi->translucency!=0.0) {
ShadeResult shr_t;
VecMulf(shi->vn, -1.0);
VecMulf(vlr->n, -1.0);
shade_lamp_loop(shi, &shr_t);
- shr->diff[0]+= shi->matren->translucency*shr_t.diff[0];
- shr->diff[1]+= shi->matren->translucency*shr_t.diff[1];
- shr->diff[2]+= shi->matren->translucency*shr_t.diff[2];
+ shr->diff[0]+= shi->translucency*shr_t.diff[0];
+ shr->diff[1]+= shi->translucency*shr_t.diff[1];
+ shr->diff[2]+= shi->translucency*shr_t.diff[2];
VecMulf(shi->vn, -1.0);
VecMulf(vlr->n, -1.0);
}
}
+ SWAP(int, osatex, shi->osatex); // XXXXX!!!!
+
if(flip) {
vlr->n[0]= -vlr->n[0];
vlr->n[1]= -vlr->n[1];
@@ -1499,20 +1460,20 @@ static void traceray(short depth, float *start, float *vec, float *col, VlakRen
if(depth>0) {
- if(shi.matren->mode & (MA_RAYTRANSP|MA_ZTRA) && shr.alpha!=1.0) {
+ if(shi.mat->mode & (MA_RAYTRANSP|MA_ZTRA) && shr.alpha!=1.0) {
float f, f1, refract[3], tracol[3];
- if(shi.matren->mode & MA_RAYTRANSP) {
+ if(shi.mat->mode & MA_RAYTRANSP) {
/* odd depths: use normal facing viewer, otherwise flip */
if(traflag & RAY_TRAFLIP) {
float norm[3];
norm[0]= - shi.vn[0];
norm[1]= - shi.vn[1];
norm[2]= - shi.vn[2];
- refraction(refract, norm, shi.view, shi.matren->ang);
+ refraction(refract, norm, shi.view, shi.ang);
}
else {
- refraction(refract, shi.vn, shi.view, shi.matren->ang);
+ refraction(refract, shi.vn, shi.view, shi.ang);
}
traflag |= RAY_TRA;
traceray(depth-1, shi.co, refract, tracol, shi.vlr, shi.mask, osatex, traflag ^ RAY_TRAFLIP);
@@ -1532,9 +1493,9 @@ static void traceray(short depth, float *start, float *vec, float *col, VlakRen
shr.alpha= 1.0;
}
- if(shi.matren->mode & MA_RAYMIRROR) {
- f= shi.matren->ray_mirror;
- if(f!=0.0) f*= fresnel_fac(shi.view, shi.vn, shi.matren->fresnel_mir_i, shi.matren->fresnel_mir);
+ if(shi.mat->mode & MA_RAYMIRROR) {
+ f= shi.ray_mirror;
+ if(f!=0.0) f*= fresnel_fac(shi.view, shi.vn, shi.mat->fresnel_mir_i, shi.mat->fresnel_mir);
}
else f= 0.0;
@@ -1551,9 +1512,9 @@ static void traceray(short depth, float *start, float *vec, float *col, VlakRen
//col[1]+= shr.spec[1];
//col[2]+= shr.spec[2];
- fr= shi.matren->mirr;
- fg= shi.matren->mirg;
- fb= shi.matren->mirb;
+ fr= shi.mirr;
+ fg= shi.mirg;
+ fb= shi.mirb;
col[0]= f*fr*(1.0-shr.spec[0])*col[0] + f1*shr.diff[0] + shr.spec[0];
col[1]= f*fg*(1.0-shr.spec[1])*col[1] + f1*shr.diff[1] + shr.spec[1];
@@ -1576,8 +1537,8 @@ static void traceray(short depth, float *start, float *vec, float *col, VlakRen
VECCOPY(shi.view, vec);
Normalise(shi.view);
-
- RE_sky(shi.view, col);
+
+ shadeSkyPixelFloat(col, shi.view, NULL);
}
}
@@ -1666,7 +1627,7 @@ static float *jitter_plane(LampRen *lar, int xs, int ys)
tot= lar->ray_totsamp;
if(lar->jitter==NULL) {
-
+ lar->jitter= (float *)4; // mislead thread quickly (tsk!)
fp=lar->jitter= MEM_mallocN(4*tot*2*sizeof(float), "lamp jitter tab");
/* fill table with random locations, area_size large */
@@ -1688,13 +1649,25 @@ static float *jitter_plane(LampRen *lar, int xs, int ys)
}
if(lar->ray_samp_type & LA_SAMP_JITTER) {
- static int xold=0, yold=0;
- /* new OSA allows to enter this function many times for 1 pixel */
- if(xold!=xs || yold!=ys) {
- jitter_plane_offset(lar->jitter, lar->jitter+2*tot, tot, lar->area_size, lar->area_sizey, BLI_frand(), BLI_frand());
- xold= xs; yold= ys;
+ /* made it threadsafe */
+ if(ys & 1) {
+ static int xold=0, yold=0;
+
+ if(xold!=xs || yold!=ys) {
+ jitter_plane_offset(lar->jitter, lar->jitter+2*tot, tot, lar->area_size, lar->area_sizey, BLI_frand(), BLI_frand());
+ xold= xs; yold= ys;
+ }
+ return lar->jitter+2*tot;
+ }
+ else {
+ static int xold=0, yold=0;
+
+ if(xold!=xs || yold!=ys) {
+ jitter_plane_offset(lar->jitter, lar->jitter+4*tot, tot, lar->area_size, lar->area_sizey, BLI_frand(), BLI_frand());
+ xold= xs; yold= ys;
+ }
+ return lar->jitter+4*tot;
}
- return lar->jitter+2*tot;
}
if(lar->ray_samp_type & LA_SAMP_DITHER) {
return lar->jitter + 2*tot*((xs & 1)+2*(ys & 1));
@@ -1714,19 +1687,19 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
float i, f, f1, fr, fg, fb, vec[3], mircol[3], tracol[3];
int do_tra, do_mir;
- do_tra= ((shi->matren->mode & (MA_RAYTRANSP|MA_ZTRA)) && shr->alpha!=1.0);
- do_mir= ((shi->matren->mode & MA_RAYMIRROR) && shi->matren->ray_mirror!=0.0);
+ do_tra= ((shi->mat->mode & (MA_RAYTRANSP|MA_ZTRA)) && shr->alpha!=1.0);
+ do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0);
vlr= shi->vlr;
if(do_tra) {
float refract[3];
- if(shi->matren->mode & MA_RAYTRANSP) {
- refraction(refract, shi->vn, shi->view, shi->matren->ang);
- traceray(shi->matren->ray_depth_tra, shi->co, refract, tracol, shi->vlr, shi->mask, 0, RAY_TRA|RAY_TRAFLIP);
+ if(shi->mat->mode & MA_RAYTRANSP) {
+ refraction(refract, shi->vn, shi->view, shi->ang);
+ traceray(shi->mat->ray_depth_tra, shi->co, refract, tracol, shi->vlr, shi->mask, 0, RAY_TRA|RAY_TRAFLIP);
}
else
- traceray(shi->matren->ray_depth_tra, shi->co, shi->view, tracol, shi->vlr, shi->mask, 0, 0);
+ traceray(shi->mat->ray_depth_tra, shi->co, shi->view, tracol, shi->vlr, shi->mask, 0, 0);
f= shr->alpha; f1= 1.0-f;
shr->diff[0]= f*shr->diff[0] + f1*tracol[0];
@@ -1737,18 +1710,18 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
if(do_mir) {
- i= shi->matren->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->matren->fresnel_mir_i, shi->matren->fresnel_mir);
+ i= shi->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->mat->fresnel_mir_i, shi->mat->fresnel_mir);
if(i!=0.0) {
- fr= shi->matren->mirr;
- fg= shi->matren->mirg;
- fb= shi->matren->mirb;
+ fr= shi->mirr;
+ fg= shi->mirg;
+ fb= shi->mirb;
if(vlr->flag & R_SMOOTH)
reflection(vec, shi->vn, shi->view, vlr->n);
else
reflection(vec, shi->vn, shi->view, NULL);
- traceray(shi->matren->ray_depth, shi->co, vec, mircol, shi->vlr, shi->mask, shi->osatex, 0);
+ traceray(shi->mat->ray_depth, shi->co, vec, mircol, shi->vlr, shi->mask, shi->osatex, 0);
f= i*fr*(1.0-shr->spec[0]); f1= 1.0-i;
shr->diff[0]= f*mircol[0] + f1*shr->diff[0];
@@ -1928,9 +1901,31 @@ static void DistributedSpherical(float *sphere, int tot, int iter)
}
}
+
+static float *threadsafe_table_sphere(int test, int xs, int ys)
+{
+ static float sphere1[2*3*256];
+ static float sphere2[2*3*256];
+ static int xs1=-1, xs2=-1, ys1=-1, ys2=-1;
+
+ if(ys & 1) {
+ if(xs==xs1 && ys==ys1) return sphere1;
+ if(test) return NULL;
+ xs1= xs; ys1= ys;
+ return sphere1;
+ }
+ else {
+ if(xs==xs2 && ys==ys2) return sphere2;
+ if(test) return NULL;
+ xs2= xs; ys2= ys;
+ return sphere2;
+ }
+}
+
static float *sphere_sampler(int type, int resol, int xs, int ys)
{
- static float sphere[2*3*256], sphere1[2*3*256];
+ static float sphere[2*3*256];
+ float *sphere1;
int tot;
float *vec;
@@ -1948,16 +1943,19 @@ static float *sphere_sampler(int type, int resol, int xs, int ys)
}
}
else {
- static int last_distr= 0, xold=0xffff, yold=0;
+ static int last_distr= 0;
float cosf, sinf, cost, sint;
float ang, *vec1;
int a;
- if(last_distr!=resol) DistributedSpherical(sphere, tot, 16);
- last_distr= resol;
+ if(last_distr!=resol) {
+ last_distr= resol;
+ DistributedSpherical(sphere, tot, 16);
+ }
- if(xold!=xs || yold!=ys) {
- xold=xs; yold=ys;
+ sphere1= threadsafe_table_sphere(1, xs, ys);
+ if(sphere1==NULL) {
+ sphere1= threadsafe_table_sphere(0, xs, ys);
// random rotation
ang= BLI_frand();
@@ -1988,21 +1986,12 @@ void ray_ao(ShadeInput *shi, World *wrld, float *shadfac)
int j=0, tot, actual=0, skyadded=0;
isec.vlrorig= shi->vlr;
+ isec.vlr_last= NULL;
isec.mode= DDA_SHADOW;
isec.lay= -1;
shadfac[0]= shadfac[1]= shadfac[2]= 0.0;
- /* if sky texture used, these values have to be reset back to original */
- if(wrld->aocolor==WO_AOSKYCOL && G.scene->world) {
- R.wrld.horr= G.scene->world->horr;
- R.wrld.horg= G.scene->world->horg;
- R.wrld.horb= G.scene->world->horb;
- R.wrld.zenr= G.scene->world->zenr;
- R.wrld.zeng= G.scene->world->zeng;
- R.wrld.zenb= G.scene->world->zenb;
- }
-
// bias prevents smoothed faces to appear flat
if(shi->vlr->flag & R_SMOOTH) {
bias= G.scene->world->aobias;
@@ -2060,7 +2049,7 @@ void ray_ao(ShadeInput *shi, World *wrld, float *shadfac)
shadfac[2]+= (1.0-fac)*R.wrld.horb + fac*R.wrld.zenb;
}
else {
- RE_sky(view, skycol);
+ shadeSkyPixelFloat(skycol, view, NULL);
shadfac[0]+= skycol[0];
shadfac[1]+= skycol[1];
shadfac[2]+= skycol[2];
@@ -2089,16 +2078,18 @@ void ray_ao(ShadeInput *shi, World *wrld, float *shadfac)
void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
{
Isect isec;
- Material stored;
float lampco[3];
- if(shi->matren->mode & MA_SHADOW_TRA) {
- isec.mode= DDA_SHADOW_TRA;
- /* needed to prevent shade_ray changing matren (textures) */
- stored= *(shi->matren);
- }
+ /* setup isec */
+ if(shi->mat->mode & MA_SHADOW_TRA) isec.mode= DDA_SHADOW_TRA;
else isec.mode= DDA_SHADOW;
+
if(lar->mode & LA_LAYER) isec.lay= lar->lay; else isec.lay= -1;
+
+ /* only when not mir tracing, first hit optimm */
+ if(shi->depth==0) isec.vlr_last= lar->vlr_last;
+ else isec.vlr_last= NULL;
+ isec.vlrorig= shi->vlr;
shadfac[3]= 1.0; // 1=full light
@@ -2111,15 +2102,12 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
VECCOPY(lampco, lar->co);
}
- /* only when not tracing, first hit optimm */
- if(shi->depth==0) g_oc.vlr_last= lar->vlr_last;
-
/* transp-shadow and soft not implemented yet */
if(lar->ray_totsamp<2 || isec.mode == DDA_SHADOW_TRA) {
- /* set up isec */
+
+ /* set up isec vec */
VECCOPY(isec.start, shi->co);
VECCOPY(isec.end, lampco);
- isec.vlrorig= shi->vlr;
if(isec.mode==DDA_SHADOW_TRA) {
isec.col[0]= isec.col[1]= isec.col[2]= 1.0;
@@ -2142,8 +2130,6 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
float fac=0.0, div=0.0, vec[3];
int a, j= -1, mask;
- isec.vlrorig= shi->vlr;
-
fac= 0.0;
jitlamp= jitter_plane(lar, floor(shi->xs+0.5), floor(shi->ys+0.5));
@@ -2188,13 +2174,8 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
shadfac[3]= 1.0-fac/div;
}
- if(shi->matren->mode & MA_SHADOW_TRA) {
- /* needed to prevent shade_ray changing matren (textures) */
- *(shi->matren)= stored;
- }
-
/* for first hit optim, set last interesected shadow face */
- if(shi->depth==0) lar->vlr_last= g_oc.vlr_last;
+ if(shi->depth==0) lar->vlr_last= isec.vlr_last;
}
diff --git a/source/blender/render/intern/source/renderHelp.c b/source/blender/render/intern/source/renderHelp.c
index 6b29e644722..ef885eccbc3 100644
--- a/source/blender/render/intern/source/renderHelp.c
+++ b/source/blender/render/intern/source/renderHelp.c
@@ -38,17 +38,13 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "BKE_utildefines.h"
#include "BLI_arithb.h"
#include "render.h"
-#include "render_intern.h"
#include "renderHelp.h"
#include "zbuf.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
static float panovco, panovsi;
static float panophi=0.0;
static float tempPanoPhi;
diff --git a/source/blender/render/intern/source/renderPreAndPost.c b/source/blender/render/intern/source/renderPreAndPost.c
index 8c43f0cc90e..0f7a98843ce 100644
--- a/source/blender/render/intern/source/renderPreAndPost.c
+++ b/source/blender/render/intern/source/renderPreAndPost.c
@@ -35,7 +35,6 @@
#include "MEM_guardedalloc.h"
#include "render.h"
-#include "render_intern.h"
#include "renderPreAndPost.h"
#include "RE_callbacks.h"
@@ -56,11 +55,6 @@ void prepareScene()
int a;
extern void makeoctree(void);
- if(R.rectot) MEM_freeN(R.rectot);
- R.rectot= 0;
- if(R.rectz) MEM_freeN(R.rectz);
- R.rectz= 0;
-
RE_local_get_renderdata();
/* SHADOW BUFFER */
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 098444b18b2..a561e39fb6f 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -37,6 +37,7 @@
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "MTC_matrixops.h"
+
#include "BKE_utildefines.h"
#include "DNA_mesh_types.h"
@@ -54,11 +55,12 @@
/* local include */
#include "RE_callbacks.h"
-#include "old_zbuffer_types.h"
#include "render.h"
-#include "render_intern.h"
#include "zbuf.h" /* stuff like bgnaccumbuf, fillrect, ...*/
#include "pixelblending.h"
+#include "pixelshading.h"
+#include "vanillaRenderPipe.h" /* transfercolour... */
+#include "gammaCorrectionTables.h"
#include "shadbuf.h"
#include "renderHelp.h"
@@ -73,62 +75,16 @@
/* own include */
#include "rendercore.h"
-#include "rendercore_int.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-/* globals for this file */
-/* moved to renderData.c? Not yet... */
-RE_Render R;
-Osa O;
-
-PixStrMain psmfirst;
-int psmteller;
+#include "SDL_thread.h"
-float fmask[256], centLut[16];
-unsigned short usegamtab=0, *mask1[9], *mask2[9], *igamtab1, *igamtab2, *gamtab;
-char cmask[256], *centmask;
-/* functions */
-/* comes from texture.c (only used here !) */
-/* extern void do_halo_tex(HaloRen *har, float xn, float yn, float *colf); */
-
-void gamtabdit(unsigned short *in, char *out);
-/* int count_mask(unsigned short ); */
-void scanlinehalo(unsigned int *rectz, unsigned int *rectt, short ys);
-/* void add_halo_flare(void); */
-void edge_enhance(void);
-
-/* Dither with gamma table? */
-void gamtabdit(unsigned short *in, char *out)
-/* unsigned short *in; */
-/* char *out; */
-{
- static short rerr=0, gerr=0, berr=0;
- unsigned int col;
- char *cp;
-
- cp= (char *)&col;
- out[0]= in[0]>>8;
-
- col= gamtab[in[2]]+berr;
- if(col>65535) col= 65535;
- out[1]= cp[2];
- berr= cp[3];
-
- col= gamtab[in[4]]+gerr;
- if(col>65535) col= 65535;
- out[2]= cp[2];
- gerr= cp[3];
-
- col= gamtab[in[6]]+rerr;
- if(col>65535) col= 65535;
- out[3]= cp[2];
- rerr= cp[3];
-
-}
+/* global for this file. struct render will be more dynamic later, to allow multiple renderers */
+RE_Render R;
float mistfactor(float *co) /* dist en height, return alpha */
{
@@ -167,55 +123,7 @@ float mistfactor(float *co) /* dist en height, return alpha */
return (1.0-fac)* (1-R.wrld.misi);
}
-void RE_sky(float *view, float *col)
-{
- float lo[3];
-
- R.wrld.skytype |= WO_ZENUP;
-
- if(R.wrld.skytype & WO_SKYREAL) {
-
- R.inprz= view[0]*R.grvec[0]+ view[1]*R.grvec[1]+ view[2]*R.grvec[2];
-
- if(R.inprz<0.0) R.wrld.skytype-= WO_ZENUP;
- R.inprz= fabs(R.inprz);
- }
- else if(R.wrld.skytype & WO_SKYPAPER) {
- R.inprz= 0.5+ 0.5*view[1];
- }
- else {
- R.inprz= fabs(0.5+ view[1]);
- }
-
- if(R.wrld.skytype & WO_SKYTEX) {
- VECCOPY(lo, view);
- if(R.wrld.skytype & WO_SKYREAL) {
-
- MTC_Mat3MulVecfl(R.imat, lo);
-
- SWAP(float, lo[1], lo[2]);
-
- }
-
- do_sky_tex(lo);
-
- }
-
- if(R.inprz>1.0) R.inprz= 1.0;
- R.inprh= 1.0-R.inprz;
-
- if(R.wrld.skytype & WO_SKYBLEND) {
- col[0]= (R.inprh*R.wrld.horr + R.inprz*R.wrld.zenr);
- col[1]= (R.inprh*R.wrld.horg + R.inprz*R.wrld.zeng);
- col[2]= (R.inprh*R.wrld.horb + R.inprz*R.wrld.zenb);
- }
- else {
- col[0]= R.wrld.horr;
- col[1]= R.wrld.horg;
- col[2]= R.wrld.horb;
- }
-}
-
+/* external for preview only */
void RE_sky_char(float *view, char *col)
{
float f, colf[3];
@@ -223,7 +131,8 @@ void RE_sky_char(float *view, char *col)
dither_value = ( (BLI_frand()-0.5)*R.r.dither_intensity)/256.0;
- RE_sky(view, colf);
+ shadeSkyPixelFloat(colf, view, NULL);
+
f= 255.0*(colf[0]+dither_value);
if(f<=0.0) col[0]= 0; else if(f>255.0) col[0]= 255;
else col[0]= (char)f;
@@ -236,176 +145,11 @@ void RE_sky_char(float *view, char *col)
col[3]= 1; /* to prevent wrong optimalisation alphaover of flares */
}
-/* ------------------------------------------------------------------------- */
-
-void scanlinesky(char *rect, int y)
-{
- /* have to type this! set to : addalphaUnder: char*, char*
- * addalphaUnderGamma: ditto called with char *, uint* !!!
- * unmangle this shit... */
- void (*alphafunc)();
- float fac, u, v, view[3];
- int dx, x, dy, ofs;
- unsigned int col=0, *rt;
- char *cp, *cp1;
-
- if(R.r.alphamode & R_ALPHAPREMUL) return;
-
- if(R.r.alphamode & R_ALPHAKEY) {
-
- cp= (char *)&col;
- cp[3]= 0;
- /* raytrace can change the R.wrld.horr, so we make sure we have the good one */
- if(G.scene->world) {
- cp[0]= 255.0*G.scene->world->horr;
- cp[1]= 255.0*G.scene->world->horg;
- cp[2]= 255.0*G.scene->world->horb;
- }
- else {
- cp[0]= 255.0*R.wrld.horr;
- cp[1]= 255.0*R.wrld.horg;
- cp[2]= 255.0*R.wrld.horb;
- }
- for(x=0; x<R.rectx; x++, rect+= 4) {
- if(rect[3]==0) {
- *( ( unsigned int *)rect)= col;
- }
- else {
- /* prevent 'col' to be in the image */
- cp1= (char *)rect;
- if( cp[0]==cp1[0] && cp[1]==cp1[1] && cp[2]==cp1[2] ) {
-
- if(cp1[3]==255) cp1[3]= 254;
- else cp1[3]++;
- }
-
- if(rect[3]!=255) {
- keyalpha(rect);
- }
- }
- }
- return;
- }
-
- if(R.wrld.mode & WO_MIST) alphafunc= addalphaUnder;
- else alphafunc= addalphaUnderGamma;
-
-
- if(R.r.bufflag & 1) {
- if(R.backbuf && R.backbuf->ok) {
- if(R.backbuf->ibuf==0) {
- R.backbuf->ibuf= IMB_loadiffname(R.backbuf->name, IB_rect);
- if(R.backbuf->ibuf==0) {
- R.backbuf->ok= 0;
- return;
- }
- }
- /* which scanline/ */
- dy= ((y+R.afmy+R.ystart)*R.backbuf->ibuf->y)/(2*R.afmy); // this division enables border/part render too
-
- if(R.flag & R_SEC_FIELD) {
- if((R.r.mode & R_ODDFIELD)==0) {
- if( dy<R.backbuf->ibuf->y) dy++;
- }
- else {
- if( dy>0) dy--;
- }
- }
-
- if(dy<0) dy= 0;
- else if(dy>=R.backbuf->ibuf->y) dy= R.backbuf->ibuf->y-1;
-
- rt= (R.backbuf->ibuf->rect + dy*R.backbuf->ibuf->x);
-
- /* at which location */
- fac= ((float)R.backbuf->ibuf->x)/(float)(2*R.afmx);
- ofs= (R.afmx+R.xstart)*fac;
- rt+= ofs;
-
- dx= (int) (65536.0*fac);
-
- ofs= 0;
- x= R.rectx;
- while( x-- ) {
- if( rect[3] != 255) {
- if(rect[3]==0) *((unsigned int *)rect)= *rt;
- else {
- alphafunc(rect, rt);
- }
- }
- rect+= 4;
-
- ofs+= dx;
- while( ofs > 65535 ) {
- ofs-= 65536;
- rt++;
- }
- }
-
- }
- return;
- }
-
- if((R.wrld.skytype & (WO_SKYBLEND+WO_SKYTEX))==0) {
- for(x=0; x<R.rectx; x++, rect+= 4) {
- if(rect[3] != 255) {
- if(rect[3]==0) *((unsigned int *)rect)= R.wrld.fastcol;
- else {
- alphafunc(rect, &R.wrld.fastcol);
- }
- }
- }
- }
- else {
-
- for(x=0; x<R.rectx; x++, rect+= 4) {
- if(rect[3] < 254) {
- if(R.wrld.skytype & WO_SKYPAPER) {
- view[0]= (x+(R.xstart))/(float)R.afmx;
- view[1]= (y+(R.ystart))/(float)R.afmy;
- view[2]= 0.0;
- }
- else {
- view[0]= (x+(R.xstart)+0.5);
-
- if(R.flag & R_SEC_FIELD) {
- if(R.r.mode & R_ODDFIELD) view[1]= (y+R.ystart)*R.ycor;
- else view[1]= (y+R.ystart+1.0)*R.ycor;
- }
- else view[1]= (y+R.ystart+0.5)*R.ycor;
-
- view[2]= -R.viewfac;
-
- fac= Normalise(view);
- if(R.wrld.skytype & WO_SKYTEX) {
- O.dxview= 1.0/fac;
- O.dyview= R.ycor/fac;
- }
- }
-
- if(R.r.mode & R_PANORAMA) {
- float panoco, panosi;
- panoco = getPanovCo();
- panosi = getPanovSi();
- u= view[0]; v= view[2];
-
- view[0]= panoco*u + panosi*v;
- view[2]= -panosi*u + panoco*v;
- }
-
- RE_sky_char(view, (char *)&col);
-
- if(rect[3]==0) *((unsigned int *)rect)= col;
- else alphafunc(rect, &col);
- }
- }
- }
-}
/* ************************************** */
-void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
+static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
{
double a, b, c, disc, nray[3], npos[3];
float t0, t1 = 0.0, t2= 0.0, t3, haint;
@@ -591,12 +335,6 @@ static void renderspothalo(ShadeInput *shi, float *col)
lar= R.la[a];
if(lar->type==LA_SPOT && (lar->mode & LA_HALO) && lar->haint>0) {
- if(lar->org) {
- lar->r= lar->org->r;
- lar->g= lar->org->g;
- lar->b= lar->org->b;
- }
-
spothalo(lar, shi, &i);
if(i>0.0) {
col[3]+= i;
@@ -610,386 +348,8 @@ static void renderspothalo(ShadeInput *shi, float *col)
if(col[3]>1.0) col[3]= 1.0;
}
-void render_lighting_halo(HaloRen *har, float *colf)
-{
- LampRen *lar;
- float i, inp, inpr, rco[3], lv[3], lampdist, ld, t, *vn;
- float ir, ig, ib, shadfac, soft;
- int a;
-
- ir= ig= ib= 0.0;
- VECCOPY(rco, har->co);
- vn= har->no;
-
- O.dxco[0]= har->hasize;
- O.dxco[1]= 0.0;
- O.dxco[2]= 0.0;
-
- O.dyco[0]= 0.0;
- O.dyco[1]= har->hasize;
- O.dyco[2]= 0.0;
-
- for(a=0; a<R.totlamp; a++) {
- lar= R.la[a];
-
- /* test for lamplayer */
- if(lar->mode & LA_LAYER) if((lar->lay & har->lay)==0) continue;
-
- /* lampdist cacluation */
- if(lar->type==LA_SUN || lar->type==LA_HEMI) {
- VECCOPY(lv, lar->vec);
- lampdist= 1.0;
- }
- else {
- lv[0]= rco[0]-lar->co[0];
- lv[1]= rco[1]-lar->co[1];
- lv[2]= rco[2]-lar->co[2];
- ld= sqrt(lv[0]*lv[0]+lv[1]*lv[1]+lv[2]*lv[2]);
- lv[0]/= ld;
- lv[1]/= ld;
- lv[2]/= ld;
-
- /* ld is re-used further on (texco's) */
-
- if(lar->mode & LA_QUAD) {
- t= 1.0;
- if(lar->ld1>0.0)
- t= lar->dist/(lar->dist+lar->ld1*ld);
- if(lar->ld2>0.0)
- t*= lar->distkw/(lar->distkw+lar->ld2*ld*ld);
-
- lampdist= t;
- }
- else {
- lampdist= (lar->dist/(lar->dist+ld));
- }
-
- if(lar->mode & LA_SPHERE) {
- t= lar->dist - ld;
- if(t<0.0) continue;
-
- t/= lar->dist;
- lampdist*= (t);
- }
-
- }
-
- if(lar->mode & LA_TEXTURE) {
- ShadeInput shi;
- VECCOPY(shi.co, rco);
- shi.osatex= 0;
- do_lamp_tex(lar, lv, &shi);
- }
-
- if(lar->type==LA_SPOT) {
-
- if(lar->mode & LA_SQUARE) {
- if(lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2]>0.0) {
- float x, lvrot[3];
-
- /* rotate view to lampspace */
- VECCOPY(lvrot, lv);
- MTC_Mat3MulVecfl(lar->imat, lvrot);
-
- x= MAX2(fabs(lvrot[0]/lvrot[2]) , fabs(lvrot[1]/lvrot[2]));
- /* 1.0/(sqrt(1+x*x)) is equivalent to cos(atan(x)) */
-
- inpr= 1.0/(sqrt(1.0+x*x));
- }
- else inpr= 0.0;
- }
- else {
- inpr= lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2];
- }
-
- t= lar->spotsi;
- if(inpr<t) continue;
- else {
- t= inpr-t;
- i= 1.0;
- soft= 1.0;
- if(t<lar->spotbl && lar->spotbl!=0.0) {
- /* soft area */
- i= t/lar->spotbl;
- t= i*i;
- soft= (3.0*t-2.0*t*i);
- inpr*= soft;
- }
- if(lar->mode & LA_ONLYSHADOW) {
- /* if(ma->mode & MA_SHADOW) { */
- /* dot product positive: front side face! */
- inp= vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2];
- if(inp>0.0) {
- /* testshadowbuf==0.0 : 100% shadow */
- shadfac = testshadowbuf(lar->shb, rco, inp);
- if( shadfac>0.0 ) {
- shadfac*= inp*soft*lar->energy;
- ir -= shadfac;
- ig -= shadfac;
- ib -= shadfac;
-
- continue;
- }
- }
- /* } */
- }
- lampdist*=inpr;
- }
- if(lar->mode & LA_ONLYSHADOW) continue;
-
- }
-
- /* dot product and reflectivity*/
-
- inp= 1.0-fabs(vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2]);
-
- /* inp= cos(0.5*M_PI-acos(inp)); */
-
- i= inp;
-
- if(lar->type==LA_HEMI) {
- i= 0.5*i+0.5;
- }
- if(i>0.0) {
- i*= lampdist;
- /* i*= lampdist*ma->ref; */
- }
-
- /* shadow */
- if(i> -0.41) { /* heuristic valua! */
- shadfac= 1.0;
- if(lar->shb) {
- /* if(ma->mode & MA_SHADOW) { */
- shadfac = testshadowbuf(lar->shb, rco, inp);
- if(shadfac==0.0) continue;
- i*= shadfac;
- /* } */
- }
- }
-
- if(i>0.0) {
- ir+= i*lar->r;
- ig+= i*lar->g;
- ib+= i*lar->b;
- }
- }
-
- if(ir<0.0) ir= 0.0;
- if(ig<0.0) ig= 0.0;
- if(ib<0.0) ib= 0.0;
-
- colf[0]*= ir;
- colf[1]*= ig;
- colf[2]*= ib;
-
-}
-
-
-void RE_shadehalo(HaloRen *har, char *col, unsigned int zz, float dist, float xn, float yn, short flarec)
-{
- /* fill in in col */
- extern float hashvectf[];
- float t, zn, radist, ringf=0.0, linef=0.0, alpha, si, co, colf[4];
- int colt, a;
-
- if(R.wrld.mode & WO_MIST) {
- if(har->type & HA_ONLYSKY) {
- /* stars have no mist */
- alpha= har->alfa;
- }
- else {
- /* patchy... */
- R.zcor= -har->co[2];
- alpha= mistfactor(har->co)*har->alfa;
- }
- }
- else alpha= har->alfa;
-
- if(alpha==0.0) {
- col[0] = 0;
- col[1] = 0;
- col[2] = 0;
- col[3] = 0;
-
-/* *( (int *)col )=0; */
-
- return;
- }
-
- radist= sqrt(dist);
-
- /* watch it: abused value: flarec was set to zero in pixstruct */
- if(flarec) har->pixels+= (int)(har->rad-radist);
-
- if(har->ringc) {
- float *rc, fac;
- int ofs;
-
- /* per ring an antialised circle */
- ofs= har->seed;
-
- for(a= har->ringc; a>0; a--, ofs+=2) {
-
- rc= hashvectf + (ofs % 768);
-
- fac= fabs( rc[1]*(har->rad*fabs(rc[0]) - radist) );
-
- if(fac< 1.0) {
- ringf+= (1.0-fac);
- }
- }
- }
-
- if(har->type & HA_VECT) {
- dist= fabs( har->cos*(yn) - har->sin*(xn) )/har->rad;
- if(dist>1.0) dist= 1.0;
- if(har->tex) {
- zn= har->sin*xn - har->cos*yn;
- yn= har->cos*xn + har->sin*yn;
- xn= zn;
- }
- }
- else dist= dist/har->radsq;
-
- if(har->type & HA_FLARECIRC) {
-
- dist= 0.5+fabs(dist-0.5);
-
- }
-
- if(har->hard>=30) {
- dist= sqrt(dist);
- if(har->hard>=40) {
- dist= sin(dist*M_PI_2);
- if(har->hard>=50) {
- dist= sqrt(dist);
- }
- }
- }
- else if(har->hard<20) dist*=dist;
-
- dist=(1.0-dist);
-
- if(har->linec) {
- float *rc, fac;
- int ofs;
-
- /* per starpoint an antialaised line */
- ofs= har->seed;
-
- for(a= har->linec; a>0; a--, ofs+=3) {
-
- rc= hashvectf + (ofs % 768);
-
- fac= fabs( (xn)*rc[0]+(yn)*rc[1]);
-
- if(fac< 1.0 ) {
- linef+= (1.0-fac);
- }
- }
-
- linef*= dist;
-
- }
-
- if(har->starpoints) {
- float ster, hoek;
- /* rotation */
- hoek= atan2(yn, xn);
- hoek*= (1.0+0.25*har->starpoints);
-
- co= cos(hoek);
- si= sin(hoek);
-
- hoek= (co*xn+si*yn)*(co*yn-si*xn);
-
- ster= fabs(hoek);
- if(ster>1.0) {
- ster= (har->rad)/(ster);
-
- if(ster<1.0) dist*= sqrt(ster);
- }
- }
-
- /* halo intersected? */
- if(har->zs> zz-har->zd) {
- t= ((float)(zz-har->zs))/(float)har->zd;
- alpha*= sqrt(sqrt(t));
- }
-
- dist*= alpha;
- ringf*= dist;
- linef*= alpha;
-
- if(dist<0.003) {
- *( (int *)col )=0;
- return;
- }
-
- /* texture? */
- if(har->tex) {
- colf[0]= har->r; colf[1]= har->g; colf[2]= har->b;
- colf[3]= dist;
- do_halo_tex(har, xn, yn, colf); // can return without setting colf
-
- /* dist== colf[3]; */
-
- colf[0]*= colf[3];
- colf[1]*= colf[3];
- colf[2]*= colf[3];
-
- }
- else {
- colf[0]= dist*har->r;
- colf[1]= dist*har->g;
- colf[2]= dist*har->b;
-
- if(har->type & HA_XALPHA) colf[3]= dist*dist;
- else colf[3]= dist;
- }
-
- if(har->mat && har->mat->mode & MA_HALO_SHADE) {
- /* we test for lights because of preview... */
- if(R.totlamp) render_lighting_halo(har, colf);
- }
-
- if(linef!=0.0) {
- Material *ma= har->mat;
-
- colf[0]+= 255.0*linef*ma->specr;
- colf[1]+= 255.0*linef*ma->specg;
- colf[2]+= 255.0*linef*ma->specb;
-
- if(har->type & HA_XALPHA) colf[3]+= linef*linef;
- else colf[3]+= linef;
- }
- if(ringf!=0.0) {
- Material *ma= har->mat;
-
- colf[0]+= 255.0*ringf*ma->mirr;
- colf[1]+= 255.0*ringf*ma->mirg;
- colf[2]+= 255.0*ringf*ma->mirb;
-
- if(har->type & HA_XALPHA) colf[3]+= ringf*ringf;
- else colf[3]+= ringf;
- }
-
- colt= 255.0*colf[3];
- if(colt>254) col[3]= 255; else col[3]= colt;
-
- colt= colf[2];
- if(colt>254) col[2]= 255; else col[2]= colt;
-
- colt= colf[1];
- if(colt>254) col[1]= 255; else col[1]= colt;
-
- colt= colf[0];
- if(colt>254) col[0]= 255; else col[0]= colt;
-
-}
-
-unsigned int calchalo_z(HaloRen *har, unsigned int zz)
+static unsigned int calchalo_z(HaloRen *har, unsigned int zz)
{
if(har->type & HA_ONLYSKY) {
@@ -1003,23 +363,24 @@ unsigned int calchalo_z(HaloRen *har, unsigned int zz)
return zz;
}
-void scanlinehaloPS(unsigned int *rectz, long *rectdelta, unsigned int *rectt, short ys)
+static void scanlinehaloPS(unsigned int *rectz, long *rectdelta, float *rowbuf, short ys)
{
HaloRen *har = NULL;
PixStr *ps;
- float dist,xsq,ysq,xn,yn;
- unsigned int a, *rz, *rt, zz;
+ float dist, xsq, ysq, xn, yn;
+ float *rb;
+ float col[4], accol[4];
+ unsigned int a, *rz, zz;
long *rd;
- int accol[4];
- short minx,maxx,x,aantal, aantalm, flarec;
- char col[4];
+ short minx, maxx, x, aantal, aantalm, flarec;
- for(a=0;a<R.tothalo;a++) {
- if((a & 255)==0) har= R.bloha[a>>8];
+ for(a=0; a<R.tothalo; a++) {
+ if((a & 255)==0) {
+ har= R.bloha[a>>8];
+ if( RE_local_test_break() ) break;
+ }
else har++;
- if( RE_local_test_break() ) break;
-
if(ys>har->maxy);
else if(ys<har->miny);
else {
@@ -1032,9 +393,9 @@ void scanlinehaloPS(unsigned int *rectz, long *rectdelta, unsigned int *rectt, s
if(minx<0) minx= 0;
if(maxx>=R.rectx) maxx= R.rectx-1;
- rt= rectt+minx;
- rd= rectdelta+minx;
- rz= rectz+minx;
+ rb= rowbuf + 4*minx;
+ rd= rectdelta + minx;
+ rz= rectz + minx;
yn= (ys-har->ys)*R.ycor;
ysq= yn*yn;
@@ -1047,21 +408,25 @@ void scanlinehaloPS(unsigned int *rectz, long *rectdelta, unsigned int *rectt, s
xsq= xn*xn;
dist= xsq+ysq;
if(dist<har->radsq) {
+
ps= (PixStr *) POINTER_FROM_CODE(*rd);
aantal= 0;
- accol[0]=accol[1]=accol[2]=accol[3]= 0;
+ accol[0]=accol[1]=accol[2]=accol[3]= 0.0;
+
while(ps) {
aantalm= count_mask(ps->mask);
aantal+= aantalm;
zz= calchalo_z(har, ps->z);
if(zz> har->zs) {
- *( (int *)col )= 0;
- RE_shadehalo(har, col, zz, dist, xn, yn, flarec);
- accol[0]+= aantalm*col[0];
- accol[1]+= aantalm*col[1];
- accol[2]+= aantalm*col[2];
- accol[3]+= aantalm*col[3];
+ float fac;
+
+ shadeHaloFloat(har, col, zz, dist, xn, yn, flarec);
+ fac= ((float)aantalm)/(float)R.osa;
+ accol[0]+= fac*col[0];
+ accol[1]+= fac*col[1];
+ accol[2]+= fac*col[2];
+ accol[3]+= fac*col[3];
flarec= 0;
}
@@ -1072,22 +437,28 @@ void scanlinehaloPS(unsigned int *rectz, long *rectdelta, unsigned int *rectt, s
zz= calchalo_z(har, *rz);
if(zz> har->zs) {
- *( (int *)col )= 0;
- RE_shadehalo(har, col, zz, dist, xn, yn, flarec);
- accol[0]+= aantal*col[0];
- accol[1]+= aantal*col[1];
- accol[2]+= aantal*col[2];
- accol[3]+= aantal*col[3];
+ float fac;
+
+ shadeHaloFloat(har, col, zz, dist, xn, yn, flarec);
+ fac= ((float)aantal)/(float)R.osa;
+ accol[0]+= fac*col[0];
+ accol[1]+= fac*col[1];
+ accol[2]+= fac*col[2];
+ accol[3]+= fac*col[3];
}
-
- col[0]= accol[0]/R.osa;
- col[1]= accol[1]/R.osa;
- col[2]= accol[2]/R.osa;
- col[3]= accol[3]/R.osa;
+ col[0]= accol[0];
+ col[1]= accol[1];
+ col[2]= accol[2];
+ col[3]= accol[3];
/* if(behind > (R.osa>>1)) addalphaUnder(rt,col); */
- RE_addalphaAddfac((char *)rt, (char *)col, har->add);
+ if(do_gamma) {
+ col[0]= gammaCorrect(col[0]);
+ col[1]= gammaCorrect(col[1]);
+ col[2]= gammaCorrect(col[2]);
+ }
+ addalphaAddfacFloat(rb, col, har->add);
}
}
else {
@@ -1097,29 +468,32 @@ void scanlinehaloPS(unsigned int *rectz, long *rectdelta, unsigned int *rectt, s
xsq= xn*xn;
dist= xsq+ysq;
if(dist<har->radsq) {
- RE_shadehalo(har, col, zz, dist, xn, yn, flarec);
- RE_addalphaAddfac((char *)rt, (char *)col, har->add);
+ shadeHaloFloat(har, col, zz, dist, xn, yn, flarec);
+ if(do_gamma) {
+ col[0]= gammaCorrect(col[0]);
+ col[1]= gammaCorrect(col[1]);
+ col[2]= gammaCorrect(col[2]);
+ }
+ addalphaAddfacFloat(rb, col, har->add);
}
}
}
- rt++;
+ rb+=4;
rz++;
rd++;
}
-
}
}
}
-
}
-void scanlinehalo(unsigned int *rectz, unsigned int *rectt, short ys)
+static void scanlinehalo(unsigned int *rectz, float *rowbuf, short ys)
{
HaloRen *har = NULL;
- float dist,xsq,ysq,xn,yn;
- unsigned int a, *rz, *rt, zz;
- short minx,maxx, x;
- char col[4];
+ float dist, xsq, ysq, xn, yn, *rb;
+ float col[4];
+ unsigned int a, *rz, zz;
+ short minx, maxx, x;
for(a=0; a<R.tothalo; a++) {
if((a & 255)==0) har= R.bloha[a>>8];
@@ -1139,8 +513,8 @@ void scanlinehalo(unsigned int *rectz, unsigned int *rectt, short ys)
if(minx<0) minx= 0;
if(maxx>=R.rectx) maxx= R.rectx-1;
- rt= rectt+minx;
- rz= rectz+minx;
+ rb= rowbuf + 4*minx;
+ rz= rectz + minx;
yn= (ys-har->ys)*R.ycor;
ysq= yn*yn;
@@ -1152,93 +526,17 @@ void scanlinehalo(unsigned int *rectz, unsigned int *rectt, short ys)
xsq= xn*xn;
dist= xsq+ysq;
if(dist<har->radsq) {
- RE_shadehalo(har, col, zz, dist, xn, yn, har->flarec);
- RE_addalphaAddfac((char *)rt, (char *)col, har->add);
+ shadeHaloFloat(har, col, zz, dist, xn, yn, har->flarec);
+ addalphaAddfacFloat(rb, col, har->add);
}
}
- rt++;
+ rb+=4;
rz++;
}
}
}
}
-
-}
-
-void halovert()
-{
- HaloRen *har = NULL;
- float dist, xsq, ysq, xn, yn;
- unsigned int a, *rectz, *rz, *rectt, *rt, zz;
- int minx, maxx, miny, maxy, x, y;
- char col[4];
-
-
- for(a=0;a<R.tothalo;a++) {
- if((a & 255)==0) har= R.bloha[a>>8];
- else har++;
-
- if(RE_local_test_break() ) break;
-
- if(har->maxy<0);
- else if(R.recty<har->miny);
- else {
- minx= floor(har->xs-har->rad);
- maxx= ceil(har->xs+har->rad);
-
- if(maxx<0);
- else if(R.rectx<minx);
- else {
-
- miny= floor(har->ys-har->rad);
- maxy= ceil(har->ys+har->rad);
-
- if(minx<0) minx= 0;
- if(maxx>=R.rectx) maxx= R.rectx-1;
- if(miny<0) miny= 0;
- if(maxy>R.recty) maxy= R.recty;
-
- rectt= R.rectot+ R.rectx*miny;
- rectz= R.rectz+ R.rectx*miny;
-
- for(y=miny;y<maxy;y++) {
-
- rz= rectz+minx;
-
- rt= (rectt+minx);
-
- yn= (y - har->ys)*R.ycor;
- ysq= yn*yn;
- for(x=minx;x<=maxx;x++) {
-
- zz= calchalo_z(har, *rz);
-
- if(zz> har->zs) {
-
- xn= x - har->xs;
- xsq= xn*xn;
- dist= xsq+ysq;
- if(dist<har->radsq) {
- RE_shadehalo(har, col, zz, dist, xn, yn, har->flarec);
-
- RE_addalphaAddfac((char *)rt, (char *)col, har->add);
-
- }
- }
- rt++;
- rz++;
- }
-
- rectt+= R.rectx;
- rectz+= R.rectx;
-
- if(RE_local_test_break() ) break;
- }
-
- }
- }
- }
}
/* ---------------- shaders ----------------------- */
@@ -1564,7 +862,7 @@ float OrenNayar_Diff(float *n, float *l, float *v, float rough )
/* --------------------------------------------- */
-
+/* also called from texture.c */
void calc_R_ref(ShadeInput *shi)
{
float i;
@@ -1577,36 +875,36 @@ void calc_R_ref(ShadeInput *shi)
shi->ref[2]= (shi->view[2]+i*shi->vn[2]);
if(shi->osatex) {
if(shi->vlr->flag & R_SMOOTH) {
- i= -2*( (shi->vn[0]+O.dxno[0])*(shi->view[0]+O.dxview) +
- (shi->vn[1]+O.dxno[1])*shi->view[1]+ (shi->vn[2]+O.dxno[2])*shi->view[2] );
+ i= -2*( (shi->vn[0]+shi->dxno[0])*(shi->view[0]+shi->dxview) +
+ (shi->vn[1]+shi->dxno[1])*shi->view[1]+ (shi->vn[2]+shi->dxno[2])*shi->view[2] );
- O.dxref[0]= shi->ref[0]- ( shi->view[0]+O.dxview+i*(shi->vn[0]+O.dxno[0]));
- O.dxref[1]= shi->ref[1]- (shi->view[1]+ i*(shi->vn[1]+O.dxno[1]));
- O.dxref[2]= shi->ref[2]- (shi->view[2]+ i*(shi->vn[2]+O.dxno[2]));
+ shi->dxref[0]= shi->ref[0]- ( shi->view[0]+shi->dxview+i*(shi->vn[0]+shi->dxno[0]));
+ shi->dxref[1]= shi->ref[1]- (shi->view[1]+ i*(shi->vn[1]+shi->dxno[1]));
+ shi->dxref[2]= shi->ref[2]- (shi->view[2]+ i*(shi->vn[2]+shi->dxno[2]));
- i= -2*( (shi->vn[0]+O.dyno[0])*shi->view[0]+
- (shi->vn[1]+O.dyno[1])*(shi->view[1]+O.dyview)+ (shi->vn[2]+O.dyno[2])*shi->view[2] );
+ i= -2*( (shi->vn[0]+shi->dyno[0])*shi->view[0]+
+ (shi->vn[1]+shi->dyno[1])*(shi->view[1]+shi->dyview)+ (shi->vn[2]+shi->dyno[2])*shi->view[2] );
- O.dyref[0]= shi->ref[0]- (shi->view[0]+ i*(shi->vn[0]+O.dyno[0]));
- O.dyref[1]= shi->ref[1]- (shi->view[1]+O.dyview+i*(shi->vn[1]+O.dyno[1]));
- O.dyref[2]= shi->ref[2]- (shi->view[2]+ i*(shi->vn[2]+O.dyno[2]));
+ shi->dyref[0]= shi->ref[0]- (shi->view[0]+ i*(shi->vn[0]+shi->dyno[0]));
+ shi->dyref[1]= shi->ref[1]- (shi->view[1]+shi->dyview+i*(shi->vn[1]+shi->dyno[1]));
+ shi->dyref[2]= shi->ref[2]- (shi->view[2]+ i*(shi->vn[2]+shi->dyno[2]));
}
else {
- i= -2*( shi->vn[0]*(shi->view[0]+O.dxview) +
+ i= -2*( shi->vn[0]*(shi->view[0]+shi->dxview) +
shi->vn[1]*shi->view[1]+ shi->vn[2]*shi->view[2] );
- O.dxref[0]= shi->ref[0]- (shi->view[0]+O.dxview+i*shi->vn[0]);
- O.dxref[1]= shi->ref[1]- (shi->view[1]+ i*shi->vn[1]);
- O.dxref[2]= shi->ref[2]- (shi->view[2]+ i*shi->vn[2]);
+ shi->dxref[0]= shi->ref[0]- (shi->view[0]+shi->dxview+i*shi->vn[0]);
+ shi->dxref[1]= shi->ref[1]- (shi->view[1]+ i*shi->vn[1]);
+ shi->dxref[2]= shi->ref[2]- (shi->view[2]+ i*shi->vn[2]);
i= -2*( shi->vn[0]*shi->view[0]+
- shi->vn[1]*(shi->view[1]+O.dyview)+ shi->vn[2]*shi->view[2] );
+ shi->vn[1]*(shi->view[1]+shi->dyview)+ shi->vn[2]*shi->view[2] );
- O.dyref[0]= shi->ref[0]- (shi->view[0]+ i*shi->vn[0]);
- O.dyref[1]= shi->ref[1]- (shi->view[1]+O.dyview+i*shi->vn[1]);
- O.dyref[2]= shi->ref[2]- (shi->view[2]+ i*shi->vn[2]);
+ shi->dyref[0]= shi->ref[0]- (shi->view[0]+ i*shi->vn[0]);
+ shi->dyref[1]= shi->ref[1]- (shi->view[1]+shi->dyview+i*shi->vn[1]);
+ shi->dyref[2]= shi->ref[2]- (shi->view[2]+ i*shi->vn[2]);
}
}
@@ -1632,34 +930,32 @@ float fresnel_fac(float *view, float *vn, float grad, float fac)
void shade_color(ShadeInput *shi, ShadeResult *shr)
{
- Material *ma= shi->matren;
+ Material *ma= shi->mat;
if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) {
- ma->r= shi->vcol[0];
- ma->g= shi->vcol[1];
- ma->b= shi->vcol[2];
+ shi->r= shi->vcol[0];
+ shi->g= shi->vcol[1];
+ shi->b= shi->vcol[2];
}
- ma->alpha= shi->mat->alpha; // copy to render material, for fresnel and spectra
-
if(ma->texco) {
if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) {
- shi->mat->r= shi->vcol[0];
- shi->mat->g= shi->vcol[1];
- shi->mat->b= shi->vcol[2];
+ shi->r= shi->vcol[0];
+ shi->g= shi->vcol[1];
+ shi->b= shi->vcol[2];
}
do_material_tex(shi);
}
if(ma->mode & (MA_ZTRA|MA_RAYTRANSP)) {
if(ma->fresnel_tra!=0.0)
- ma->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
+ shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
}
- shr->diff[0]= ma->r;
- shr->diff[1]= ma->g;
- shr->diff[2]= ma->b;
- shr->alpha= ma->alpha;
+ shr->diff[0]= shi->r;
+ shr->diff[1]= shi->g;
+ shr->diff[2]= shi->b;
+ shr->alpha= shi->alpha;
}
/* r g b = 1 value, col = vector */
@@ -1729,7 +1025,7 @@ static void ramp_blend(int type, float *r, float *g, float *b, float fac, float
/* ramp for at end of shade */
void ramp_diffuse_result(float *diff, ShadeInput *shi)
{
- Material *ma= shi->matren;
+ Material *ma= shi->mat;
float col[4], fac=0;
if(ma->ramp_col) {
@@ -1749,7 +1045,7 @@ void ramp_diffuse_result(float *diff, ShadeInput *shi)
/* r,g,b denote energy, ramp is used with different values to make new material color */
void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, float b)
{
- Material *ma= shi->matren;
+ Material *ma= shi->mat;
float col[4], colt[3], fac=0;
if(ma->ramp_col && (ma->mode & MA_RAMP_COL)) {
@@ -1757,9 +1053,9 @@ void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, fl
/* MA_RAMP_IN_RESULT is exceptional */
if(ma->rampin_col==MA_RAMP_IN_RESULT) {
// normal add
- diff[0] += r * ma->r;
- diff[1] += g * ma->g;
- diff[2] += b * ma->b;
+ diff[0] += r * shi->r;
+ diff[1] += g * shi->g;
+ diff[2] += b * shi->b;
}
else {
/* input */
@@ -1779,7 +1075,7 @@ void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, fl
/* blending method */
fac= col[3]*ma->rampfac_col;
- colt[0]= ma->r; colt[1]= ma->g; colt[2]= ma->b;
+ colt[0]= shi->r; colt[1]= shi->g; colt[2]= shi->b;
ramp_blend(ma->rampblend_col, colt, colt+1, colt+2, fac, col);
@@ -1790,15 +1086,15 @@ void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, fl
}
}
else {
- diff[0] += r * ma->r;
- diff[1] += g * ma->g;
- diff[2] += b * ma->b;
+ diff[0] += r * shi->r;
+ diff[1] += g * shi->g;
+ diff[2] += b * shi->b;
}
}
void ramp_spec_result(float *specr, float *specg, float *specb, ShadeInput *shi)
{
- Material *ma= shi->matren;
+ Material *ma= shi->mat;
float col[4];
float fac;
@@ -1817,13 +1113,13 @@ void ramp_spec_result(float *specr, float *specg, float *specb, ShadeInput *shi)
/* is = dot product shade, t = spec energy */
void do_specular_ramp(ShadeInput *shi, float is, float t, float *spec)
{
- Material *ma= shi->matren;
+ Material *ma= shi->mat;
float col[4];
float fac=0.0;
- spec[0]= ma->specr;
- spec[1]= ma->specg;
- spec[2]= ma->specb;
+ spec[0]= shi->specr;
+ spec[1]= shi->specg;
+ spec[2]= shi->specb;
/* MA_RAMP_IN_RESULT is exception */
if(ma->ramp_spec && (ma->rampin_spec!=MA_RAMP_IN_RESULT)) {
@@ -1856,18 +1152,15 @@ static void ambient_occlusion(World *wrld, ShadeInput *shi, ShadeResult *shr)
{
float f, shadfac[4];
- if((wrld->mode & WO_AMB_OCC) && (R.r.mode & R_RAYTRACE) && shi->matren->amb!=0.0) {
+ if((wrld->mode & WO_AMB_OCC) && (R.r.mode & R_RAYTRACE) && shi->amb!=0.0) {
ray_ao(shi, wrld, shadfac);
if(wrld->aocolor==WO_AOPLAIN) {
if (wrld->aomix==WO_AOADDSUB) shadfac[3] = 2.0*shadfac[3]-1.0;
else if (wrld->aomix==WO_AOSUB) shadfac[3] = shadfac[3]-1.0;
- f= wrld->aoenergy*shadfac[3]*shi->matren->amb;
+ f= wrld->aoenergy*shadfac[3]*shi->amb;
add_to_diffuse(shr->diff, shi, f, f, f, f);
- //shr->diff[0] += f;
- //shr->diff[1] += f;
- //shr->diff[2] += f;
}
else {
if (wrld->aomix==WO_AOADDSUB) {
@@ -1880,11 +1173,8 @@ static void ambient_occlusion(World *wrld, ShadeInput *shi, ShadeResult *shr)
shadfac[1] = shadfac[1]-1.0;
shadfac[2] = shadfac[2]-1.0;
}
- f= wrld->aoenergy*shi->matren->amb;
+ f= wrld->aoenergy*shi->amb;
add_to_diffuse(shr->diff, shi, f, f*shadfac[0], f*shadfac[1], f*shadfac[2]);
- //shr->diff[0] += f*shadfac[0];
- //shr->diff[1] += f*shadfac[1];
- //shr->diff[2] += f*shadfac[2];
}
}
}
@@ -1892,9 +1182,9 @@ static void ambient_occlusion(World *wrld, ShadeInput *shi, ShadeResult *shr)
void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
{
LampRen *lar;
- Material *ma= shi->matren;
+ Material *ma= shi->mat;
VlakRen *vlr= shi->vlr;
- float i, inp, inpr, is, t, lv[3], lampdist, ld = 0;
+ float i, inp, inpr, is, t, lv[3], lacol[3], lampdist, ld = 0;
float lvrot[3], *vn, *view, shadfac[4], soft, phongcorr; // shadfac = rgba
int a;
@@ -1931,7 +1221,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
inp= vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2];
- if(lar->shb) i = testshadowbuf(lar->shb, shi->co, inp);
+ if(lar->shb) i = testshadowbuf(lar->shb, shi->co, shi->dxco, shi->dyco, inp);
else {
float shad[4];
ray_shadow(shi, lar, shad);
@@ -1968,17 +1258,17 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
if(ir>0.0) {
shadfac[3]/= ir;
- shr->alpha= (shi->mat->alpha)*(1.0-shadfac[3]);
+ shr->alpha= (shi->alpha)*(1.0-shadfac[3]);
}
}
- if((R.wrld.mode & WO_AMB_OCC) && (R.r.mode & R_RAYTRACE) && shi->matren->amb!=0.0) {
+ if((R.wrld.mode & WO_AMB_OCC) && (R.r.mode & R_RAYTRACE) && shi->amb!=0.0) {
float f;
ray_ao(shi, &R.wrld, shadfac); // shadfac==0: full light
shadfac[3]= 1.0-shadfac[3];
- f= R.wrld.aoenergy*shadfac[3]*shi->matren->amb;
+ f= R.wrld.aoenergy*shadfac[3]*shi->amb;
if(R.wrld.aomix==WO_AOADD) {
shr->alpha += f;
@@ -1997,44 +1287,42 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) {
- ma->r= shi->vcol[0];
- ma->g= shi->vcol[1];
- ma->b= shi->vcol[2];
+ shi->r= shi->vcol[0];
+ shi->g= shi->vcol[1];
+ shi->b= shi->vcol[2];
}
- ma->alpha= shi->mat->alpha; // copy to render material, for fresnel and spectra
-
/* envmap hack, always reset */
shi->refcol[0]= shi->refcol[1]= shi->refcol[2]= shi->refcol[3]= 0.0;
if(ma->texco) {
if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) {
- shi->mat->r= shi->vcol[0];
- shi->mat->g= shi->vcol[1];
- shi->mat->b= shi->vcol[2];
+ shi->r= shi->vcol[0];
+ shi->g= shi->vcol[1];
+ shi->b= shi->vcol[2];
}
do_material_tex(shi);
}
if(ma->mode & MA_SHLESS) {
- shr->diff[0]= ma->r;
- shr->diff[1]= ma->g;
- shr->diff[2]= ma->b;
- shr->alpha= ma->alpha;
+ shr->diff[0]= shi->r;
+ shr->diff[1]= shi->g;
+ shr->diff[2]= shi->b;
+ shr->alpha= shi->alpha;
return;
}
if( (ma->mode & (MA_VERTEXCOL+MA_VERTEXCOLP))== MA_VERTEXCOL ) {
// add_to_diffuse(shr->diff, shi, 1.0, ma->emit+shi->vcol[0], ma->emit+shi->vcol[1], ma->emit+shi->vcol[2]);
- shr->diff[0]= ma->r*(ma->emit+shi->vcol[0]);
- shr->diff[1]= ma->g*(ma->emit+shi->vcol[1]);
- shr->diff[2]= ma->b*(ma->emit+shi->vcol[2]);
+ shr->diff[0]= shi->r*(shi->emit+shi->vcol[0]);
+ shr->diff[1]= shi->g*(shi->emit+shi->vcol[1]);
+ shr->diff[2]= shi->b*(shi->emit+shi->vcol[2]);
}
else {
// add_to_diffuse(shr->diff, shi, 1.0, ma->emit, ma->emit, ma->emit);
- shr->diff[0]= ma->r*ma->emit;
- shr->diff[1]= ma->g*ma->emit;
- shr->diff[2]= ma->b*ma->emit;
+ shr->diff[0]= shi->r*shi->emit;
+ shr->diff[1]= shi->g*shi->emit;
+ shr->diff[2]= shi->b*shi->emit;
}
ambient_occlusion(&R.wrld, shi, shr);
@@ -2089,8 +1377,10 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
}
- if(lar->mode & LA_TEXTURE) do_lamp_tex(lar, lv, shi);
-
+ lacol[0]= lar->r;
+ lacol[1]= lar->g;
+ lacol[2]= lar->b;
+
/* init transp shadow */
shadfac[3]= 1.0;
if(ma->mode & MA_SHADOW_TRA) shadfac[0]= shadfac[1]= shadfac[2]= 1.0;
@@ -2135,17 +1425,19 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if(lar->mode & LA_OSATEX) {
shi->osatex= 1; /* signal for multitex() */
- O.dxlv[0]= lv[0] - (shi->co[0]-lar->co[0]+O.dxco[0])/ld;
- O.dxlv[1]= lv[1] - (shi->co[1]-lar->co[1]+O.dxco[1])/ld;
- O.dxlv[2]= lv[2] - (shi->co[2]-lar->co[2]+O.dxco[2])/ld;
+ shi->dxlv[0]= lv[0] - (shi->co[0]-lar->co[0]+shi->dxco[0])/ld;
+ shi->dxlv[1]= lv[1] - (shi->co[1]-lar->co[1]+shi->dxco[1])/ld;
+ shi->dxlv[2]= lv[2] - (shi->co[2]-lar->co[2]+shi->dxco[2])/ld;
- O.dylv[0]= lv[0] - (shi->co[0]-lar->co[0]+O.dyco[0])/ld;
- O.dylv[1]= lv[1] - (shi->co[1]-lar->co[1]+O.dyco[1])/ld;
- O.dylv[2]= lv[2] - (shi->co[2]-lar->co[2]+O.dyco[2])/ld;
+ shi->dylv[0]= lv[0] - (shi->co[0]-lar->co[0]+shi->dyco[0])/ld;
+ shi->dylv[1]= lv[1] - (shi->co[1]-lar->co[1]+shi->dyco[1])/ld;
+ shi->dylv[2]= lv[2] - (shi->co[2]-lar->co[2]+shi->dyco[2])/ld;
}
}
+ if(lar->mode & LA_TEXTURE) do_lamp_tex(lar, lv, shi, lacol);
+
/* dot product and reflectivity */
/* inp = dotproduct, is = shader result, i = lamp energy (with shadow) */
@@ -2186,7 +1478,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
i= is*phongcorr;
if(i>0.0) {
- i*= lampdist*ma->ref;
+ i*= lampdist*shi->refl;
}
/* shadow and spec, (lampdist==0 outside spot) */
@@ -2197,7 +1489,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if(lar->type==LA_HEMI); // no shadow
else {
if(lar->shb) {
- shadfac[3] = testshadowbuf(lar->shb, shi->co, inp);
+ shadfac[3] = testshadowbuf(lar->shb, shi->co, shi->dxco, shi->dyco, inp);
}
else if(lar->mode & LA_SHAD_RAY) {
ray_shadow(shi, lar, shadfac);
@@ -2207,9 +1499,9 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if(lar->mode & LA_ONLYSHADOW) {
shadfac[3]= i*lar->energy*(1.0-shadfac[3]);
- shr->diff[0] -= shadfac[3]*ma->r;
- shr->diff[1] -= shadfac[3]*ma->g;
- shr->diff[2] -= shadfac[3]*ma->b;
+ shr->diff[0] -= shadfac[3]*shi->r;
+ shr->diff[1] -= shadfac[3]*shi->g;
+ shr->diff[2] -= shadfac[3]*shi->b;
continue;
}
@@ -2222,7 +1514,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
/* specularity */
- if(shadfac[3]>0.0 && ma->spec!=0.0 && !(lar->mode & LA_NO_SPEC)) {
+ if(shadfac[3]>0.0 && shi->spec!=0.0 && !(lar->mode & LA_NO_SPEC)) {
if(lar->type==LA_HEMI) {
/* hemi uses no spec shaders (yet) */
@@ -2239,40 +1531,40 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
t= 0.5*t+0.5;
}
- t= shadfac[3]*ma->spec*spec(t, ma->har);
- shr->spec[0]+= t*(lar->r * ma->specr);
- shr->spec[1]+= t*(lar->g * ma->specg);
- shr->spec[2]+= t*(lar->b * ma->specb);
+ t= shadfac[3]*shi->spec*spec(t, shi->har);
+ shr->spec[0]+= t*(lacol[0] * shi->specr);
+ shr->spec[1]+= t*(lacol[1] * shi->specg);
+ shr->spec[2]+= t*(lacol[2] * shi->specb);
}
else {
/* specular shaders */
float specfac;
if(ma->spec_shader==MA_SPEC_PHONG)
- specfac= Phong_Spec(vn, lv, view, ma->har);
+ specfac= Phong_Spec(vn, lv, view, shi->har);
else if(ma->spec_shader==MA_SPEC_COOKTORR)
- specfac= CookTorr_Spec(vn, lv, view, ma->har);
+ specfac= CookTorr_Spec(vn, lv, view, shi->har);
else if(ma->spec_shader==MA_SPEC_BLINN)
- specfac= Blinn_Spec(vn, lv, view, ma->refrac, (float)ma->har);
+ specfac= Blinn_Spec(vn, lv, view, ma->refrac, (float)shi->har);
else
specfac= Toon_Spec(vn, lv, view, ma->param[2], ma->param[3]);
/* area lamp correction */
if(lar->type==LA_AREA) specfac*= inp;
- t= shadfac[3]*ma->spec*lampdist*specfac;
+ t= shadfac[3]*shi->spec*lampdist*specfac;
if(ma->mode & MA_RAMP_SPEC) {
float spec[3];
do_specular_ramp(shi, specfac, t, spec);
- shr->spec[0]+= t*(lar->r * spec[0]);
- shr->spec[1]+= t*(lar->g * spec[1]);
- shr->spec[2]+= t*(lar->b * spec[2]);
+ shr->spec[0]+= t*(lacol[0] * spec[0]);
+ shr->spec[1]+= t*(lacol[1] * spec[1]);
+ shr->spec[2]+= t*(lacol[2] * spec[2]);
}
else {
- shr->spec[0]+= t*(lar->r * ma->specr);
- shr->spec[1]+= t*(lar->g * ma->specg);
- shr->spec[2]+= t*(lar->b * ma->specb);
+ shr->spec[0]+= t*(lacol[0] * shi->specr);
+ shr->spec[1]+= t*(lacol[1] * shi->specg);
+ shr->spec[2]+= t*(lacol[2] * shi->specb);
}
}
}
@@ -2281,43 +1573,43 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
/* in case 'no diffuse' we still do most calculus, spec can be in shadow */
if(i>0.0 && !(lar->mode & LA_NO_DIFF)) {
if(ma->mode & MA_SHADOW_TRA) {
- add_to_diffuse(shr->diff, shi, is, i*shadfac[0]*lar->r, i*shadfac[1]*lar->g, i*shadfac[2]*lar->b);
+ add_to_diffuse(shr->diff, shi, is, i*shadfac[0]*lacol[0], i*shadfac[1]*lacol[1], i*shadfac[2]*lacol[2]);
}
else {
- add_to_diffuse(shr->diff, shi, is, i*lar->r, i*lar->g, i*lar->b);
+ add_to_diffuse(shr->diff, shi, is, i*lacol[0], i*lacol[1], i*lacol[2]);
}
}
}
if(ma->mode & (MA_ZTRA|MA_RAYTRANSP)) {
if(ma->fresnel_tra!=0.0)
- ma->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
+ shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
- if(ma->spectra!=0.0) {
+ if(shi->spectra!=0.0) {
t = MAX3(shr->spec[0], shr->spec[1], shr->spec[2]);
- t *= ma->spectra;
+ t *= shi->spectra;
if(t>1.0) t= 1.0;
- ma->alpha= (1.0-t)*ma->alpha+t;
+ shi->alpha= (1.0-t)*shi->alpha+t;
}
}
- shr->alpha= ma->alpha;
+ shr->alpha= shi->alpha;
if(shr->spec[0]<0.0) shr->spec[0]= 0.0;
if(shr->spec[1]<0.0) shr->spec[1]= 0.0;
if(shr->spec[2]<0.0) shr->spec[2]= 0.0;
- shr->diff[0]+= ma->r*ma->amb*shi->rad[0];
- shr->diff[0]+= ma->ambr;
+ shr->diff[0]+= shi->r*shi->amb*shi->rad[0];
+ shr->diff[0]+= shi->ambr;
if(shr->diff[0]<0.0) shr->diff[0]= 0.0;
- shr->diff[1]+= ma->g*ma->amb*shi->rad[1];
- shr->diff[1]+= ma->ambg;
+ shr->diff[1]+= shi->g*shi->amb*shi->rad[1];
+ shr->diff[1]+= shi->ambg;
if(shr->diff[1]<0.0) shr->diff[1]= 0.0;
- shr->diff[2]+= ma->b*ma->amb*shi->rad[2];
- shr->diff[2]+= ma->ambb;
+ shr->diff[2]+= shi->b*shi->amb*shi->rad[2];
+ shr->diff[2]+= shi->ambb;
if(shr->diff[2]<0.0) shr->diff[2]= 0.0;
if(ma->mode & MA_RAMP_COL) ramp_diffuse_result(shr->diff, shi);
@@ -2325,9 +1617,9 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
/* refcol is for envmap only */
if(shi->refcol[0]!=0.0) {
- shr->diff[0]= ma->mirr*shi->refcol[1] + (1.0 - ma->mirr*shi->refcol[0])*shr->diff[0];
- shr->diff[1]= ma->mirg*shi->refcol[2] + (1.0 - ma->mirg*shi->refcol[0])*shr->diff[1];
- shr->diff[2]= ma->mirb*shi->refcol[3] + (1.0 - ma->mirb*shi->refcol[0])*shr->diff[2];
+ shr->diff[0]= shi->mirr*shi->refcol[1] + (1.0 - shi->mirr*shi->refcol[0])*shr->diff[0];
+ shr->diff[1]= shi->mirg*shi->refcol[2] + (1.0 - shi->mirg*shi->refcol[0])*shr->diff[1];
+ shr->diff[2]= shi->mirb*shi->refcol[3] + (1.0 - shi->mirb*shi->refcol[0])*shr->diff[2];
}
}
@@ -2337,8 +1629,8 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i
VertRen *v1, *v2, *v3;
VlakRen *vlr= shi->vlr;
float l, dl;
- short texco= shi->matren->texco;
- int mode= shi->matren->mode;
+ short texco= shi->mat->texco;
+ int mode= shi->mat->mode;
char p1, p2, p3;
/* for rendering of quads, the following values are used to denote vertices:
@@ -2400,30 +1692,30 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i
u= (shi->co[0]-v3->co[0])*t11-(shi->co[1]-v3->co[1])*t10;
v= (shi->co[1]-v3->co[1])*t00-(shi->co[0]-v3->co[0])*t01;
if(shi->osatex) {
- O.dxuv[0]= O.dxco[0]*t11- O.dxco[1]*t10;
- O.dxuv[1]= O.dxco[1]*t00- O.dxco[0]*t01;
- O.dyuv[0]= O.dyco[0]*t11- O.dyco[1]*t10;
- O.dyuv[1]= O.dyco[1]*t00- O.dyco[0]*t01;
+ shi->dxuv[0]= shi->dxco[0]*t11- shi->dxco[1]*t10;
+ shi->dxuv[1]= shi->dxco[1]*t00- shi->dxco[0]*t01;
+ shi->dyuv[0]= shi->dyco[0]*t11- shi->dyco[1]*t10;
+ shi->dyuv[1]= shi->dyco[1]*t00- shi->dyco[0]*t01;
}
}
else if(vlr->snproj==1) {
u= (shi->co[0]-v3->co[0])*t11-(shi->co[2]-v3->co[2])*t10;
v= (shi->co[2]-v3->co[2])*t00-(shi->co[0]-v3->co[0])*t01;
if(shi->osatex) {
- O.dxuv[0]= O.dxco[0]*t11- O.dxco[2]*t10;
- O.dxuv[1]= O.dxco[2]*t00- O.dxco[0]*t01;
- O.dyuv[0]= O.dyco[0]*t11- O.dyco[2]*t10;
- O.dyuv[1]= O.dyco[2]*t00- O.dyco[0]*t01;
+ shi->dxuv[0]= shi->dxco[0]*t11- shi->dxco[2]*t10;
+ shi->dxuv[1]= shi->dxco[2]*t00- shi->dxco[0]*t01;
+ shi->dyuv[0]= shi->dyco[0]*t11- shi->dyco[2]*t10;
+ shi->dyuv[1]= shi->dyco[2]*t00- shi->dyco[0]*t01;
}
}
else {
u= (shi->co[1]-v3->co[1])*t11-(shi->co[2]-v3->co[2])*t10;
v= (shi->co[2]-v3->co[2])*t00-(shi->co[1]-v3->co[1])*t01;
if(shi->osatex) {
- O.dxuv[0]= O.dxco[1]*t11- O.dxco[2]*t10;
- O.dxuv[1]= O.dxco[2]*t00- O.dxco[1]*t01;
- O.dyuv[0]= O.dyco[1]*t11- O.dyco[2]*t10;
- O.dyuv[1]= O.dyco[2]*t00- O.dyco[1]*t01;
+ shi->dxuv[0]= shi->dxco[1]*t11- shi->dxco[2]*t10;
+ shi->dxuv[1]= shi->dxco[2]*t00- shi->dxco[1]*t01;
+ shi->dyuv[0]= shi->dyco[1]*t11- shi->dyco[2]*t10;
+ shi->dyuv[1]= shi->dyco[2]*t00- shi->dyco[1]*t01;
}
}
}
@@ -2459,14 +1751,14 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i
Normalise(shi->vn);
if(shi->osatex && (texco & (TEXCO_NORM|TEXCO_REFL)) ) {
- dl= O.dxuv[0]+O.dxuv[1];
- O.dxno[0]= dl*n3[0]-O.dxuv[0]*n1[0]-O.dxuv[1]*n2[0];
- O.dxno[1]= dl*n3[1]-O.dxuv[0]*n1[1]-O.dxuv[1]*n2[1];
- O.dxno[2]= dl*n3[2]-O.dxuv[0]*n1[2]-O.dxuv[1]*n2[2];
- dl= O.dyuv[0]+O.dyuv[1];
- O.dyno[0]= dl*n3[0]-O.dyuv[0]*n1[0]-O.dyuv[1]*n2[0];
- O.dyno[1]= dl*n3[1]-O.dyuv[0]*n1[1]-O.dyuv[1]*n2[1];
- O.dyno[2]= dl*n3[2]-O.dyuv[0]*n1[2]-O.dyuv[1]*n2[2];
+ dl= shi->dxuv[0]+shi->dxuv[1];
+ shi->dxno[0]= dl*n3[0]-shi->dxuv[0]*n1[0]-shi->dxuv[1]*n2[0];
+ shi->dxno[1]= dl*n3[1]-shi->dxuv[0]*n1[1]-shi->dxuv[1]*n2[1];
+ shi->dxno[2]= dl*n3[2]-shi->dxuv[0]*n1[2]-shi->dxuv[1]*n2[2];
+ dl= shi->dyuv[0]+shi->dyuv[1];
+ shi->dyno[0]= dl*n3[0]-shi->dyuv[0]*n1[0]-shi->dyuv[1]*n2[0];
+ shi->dyno[1]= dl*n3[1]-shi->dyuv[0]*n1[1]-shi->dyuv[1]*n2[1];
+ shi->dyno[2]= dl*n3[2]-shi->dyuv[0]*n1[2]-shi->dyuv[1]*n2[2];
}
}
@@ -2474,7 +1766,7 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i
VECCOPY(shi->vn, vlr->n);
}
- /* texture coordinates. O.dxuv O.dyuv have been set */
+ /* texture coordinates. shi->dxuv shi->dyuv have been set */
if(texco & NEED_UV) {
if(texco & TEXCO_ORCO) {
if(v1->orco) {
@@ -2489,14 +1781,14 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i
shi->lo[2]= l*o3[2]-u*o1[2]-v*o2[2];
if(shi->osatex) {
- dl= O.dxuv[0]+O.dxuv[1];
- O.dxlo[0]= dl*o3[0]-O.dxuv[0]*o1[0]-O.dxuv[1]*o2[0];
- O.dxlo[1]= dl*o3[1]-O.dxuv[0]*o1[1]-O.dxuv[1]*o2[1];
- O.dxlo[2]= dl*o3[2]-O.dxuv[0]*o1[2]-O.dxuv[1]*o2[2];
- dl= O.dyuv[0]+O.dyuv[1];
- O.dylo[0]= dl*o3[0]-O.dyuv[0]*o1[0]-O.dyuv[1]*o2[0];
- O.dylo[1]= dl*o3[1]-O.dyuv[0]*o1[1]-O.dyuv[1]*o2[1];
- O.dylo[2]= dl*o3[2]-O.dyuv[0]*o1[2]-O.dyuv[1]*o2[2];
+ dl= shi->dxuv[0]+shi->dxuv[1];
+ shi->dxlo[0]= dl*o3[0]-shi->dxuv[0]*o1[0]-shi->dxuv[1]*o2[0];
+ shi->dxlo[1]= dl*o3[1]-shi->dxuv[0]*o1[1]-shi->dxuv[1]*o2[1];
+ shi->dxlo[2]= dl*o3[2]-shi->dxuv[0]*o1[2]-shi->dxuv[1]*o2[2];
+ dl= shi->dyuv[0]+shi->dyuv[1];
+ shi->dylo[0]= dl*o3[0]-shi->dyuv[0]*o1[0]-shi->dyuv[1]*o2[0];
+ shi->dylo[1]= dl*o3[1]-shi->dyuv[0]*o1[1]-shi->dyuv[1]*o2[1];
+ shi->dylo[2]= dl*o3[2]-shi->dyuv[0]*o1[2]-shi->dyuv[1]*o2[2];
}
}
}
@@ -2505,10 +1797,10 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i
VECCOPY(shi->gl, shi->co);
MTC_Mat4MulVecfl(R.viewinv, shi->gl);
if(shi->osatex) {
- VECCOPY(O.dxgl, O.dxco);
- MTC_Mat3MulVecfl(R.imat, O.dxco);
- VECCOPY(O.dygl, O.dyco);
- MTC_Mat3MulVecfl(R.imat, O.dyco);
+ VECCOPY(shi->dxgl, shi->dxco);
+ MTC_Mat3MulVecfl(R.imat, shi->dxco);
+ VECCOPY(shi->dygl, shi->dyco);
+ MTC_Mat3MulVecfl(R.imat, shi->dyco);
}
}
if((texco & TEXCO_UV) || (mode & (MA_VERTEXCOL|MA_FACETEXTURE))) {
@@ -2567,19 +1859,19 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i
if(shi->osatex) {
float duv[2];
- dl= O.dxuv[0]+O.dxuv[1];
- duv[0]= O.dxuv[0];
- duv[1]= O.dxuv[1];
+ dl= shi->dxuv[0]+shi->dxuv[1];
+ duv[0]= shi->dxuv[0];
+ duv[1]= shi->dxuv[1];
- O.dxuv[0]= 2.0*(dl*uv3[0]-duv[0]*uv1[0]-duv[1]*uv2[0]);
- O.dxuv[1]= 2.0*(dl*uv3[1]-duv[0]*uv1[1]-duv[1]*uv2[1]);
+ shi->dxuv[0]= 2.0*(dl*uv3[0]-duv[0]*uv1[0]-duv[1]*uv2[0]);
+ shi->dxuv[1]= 2.0*(dl*uv3[1]-duv[0]*uv1[1]-duv[1]*uv2[1]);
- dl= O.dyuv[0]+O.dyuv[1];
- duv[0]= O.dyuv[0];
- duv[1]= O.dyuv[1];
+ dl= shi->dyuv[0]+shi->dyuv[1];
+ duv[0]= shi->dyuv[0];
+ duv[1]= shi->dyuv[1];
- O.dyuv[0]= 2.0*(dl*uv3[0]-duv[0]*uv1[0]-duv[1]*uv2[0]);
- O.dyuv[1]= 2.0*(dl*uv3[1]-duv[0]*uv1[1]-duv[1]*uv2[1]);
+ shi->dyuv[0]= 2.0*(dl*uv3[0]-duv[0]*uv1[0]-duv[1]*uv2[0]);
+ shi->dyuv[1]= 2.0*(dl*uv3[1]-duv[0]*uv1[1]-duv[1]*uv2[1]);
}
if(mode & MA_FACETEXTURE) {
@@ -2660,10 +1952,15 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
vlr= RE_findOrAddVlak( (vlaknr-1) & 0x7FFFFF);
- shi.mat= vlr->mat;
- shi.matren= shi.mat->ren;
shi.vlr= vlr;
- shi.osatex= (shi.matren->texco & TEXCO_OSA);
+ shi.mat= vlr->mat;
+
+ // copy all relevant material vars, note, keep this synced with render_types.h
+ memcpy(&shi.r, &shi.mat->r, 23*sizeof(float));
+ // set special cases:
+ shi.har= shi.mat->har;
+ if((shi.mat->mode & MA_RAYMIRROR)==0) shi.ray_mirror= 0.0;
+ shi.osatex= (shi.mat->texco & TEXCO_OSA);
v1= vlr->v1;
dvlak= v1->co[0]*vlr->n[0]+v1->co[1]*vlr->n[1]+v1->co[2]*vlr->n[2];
@@ -2702,13 +1999,13 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
float u= dvlak/(deler-vlr->n[0]);
float v= dvlak/(deler- R.ycor*vlr->n[1]);
- O.dxco[0]= shi.co[0]- (shi.view[0]-1.0)*u;
- O.dxco[1]= shi.co[1]- (shi.view[1])*u;
- O.dxco[2]= shi.co[2]- (shi.view[2])*u;
+ shi.dxco[0]= shi.co[0]- (shi.view[0]-1.0)*u;
+ shi.dxco[1]= shi.co[1]- (shi.view[1])*u;
+ shi.dxco[2]= shi.co[2]- (shi.view[2])*u;
- O.dyco[0]= shi.co[0]- (shi.view[0])*v;
- O.dyco[1]= shi.co[1]- (shi.view[1]-1.0*R.ycor)*v;
- O.dyco[2]= shi.co[2]- (shi.view[2])*v;
+ shi.dyco[0]= shi.co[0]- (shi.view[0])*v;
+ shi.dyco[1]= shi.co[1]- (shi.view[1]-1.0*R.ycor)*v;
+ shi.dyco[2]= shi.co[2]- (shi.view[2])*v;
}
@@ -2716,9 +2013,9 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
R.zcor*= fac; /* for mist */
if(shi.osatex) {
- if( (shi.matren->texco & TEXCO_REFL) ) {
- O.dxview= -1.0/fac;
- O.dyview= -R.ycor/fac;
+ if( (shi.mat->texco & TEXCO_REFL) ) {
+ shi.dxview= -1.0/fac;
+ shi.dyview= -R.ycor/fac;
}
}
@@ -2729,13 +2026,19 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
shade_input_set_coords(&shi, 1.0, 1.0, 0, 1, 2);
/* this only avalailable for scanline */
- if(shi.matren->texco & TEXCO_WINDOW) {
+ if(shi.mat->texco & TEXCO_WINDOW) {
shi.winco[0]= (x+(R.xstart))/(float)R.afmx;
shi.winco[1]= (y+(R.ystart))/(float)R.afmy;
shi.winco[2]= 0.0;
+ if(shi.osatex) {
+ shi.dxwin[0]= 0.5/(float)R.r.xsch;
+ shi.dywin[1]= 0.5/(float)R.r.ysch;
+ shi.dxwin[1]= shi.dxwin[2]= 0.0;
+ shi.dywin[0]= shi.dywin[2]= 0.0;
+ }
}
- /* after this the u and v AND O.dxuv and O.dyuv are incorrect */
- if(shi.matren->texco & TEXCO_STICKY) {
+ /* after this the u and v AND shi.dxuv and shi.dyuv are incorrect */
+ if(shi.mat->texco & TEXCO_STICKY) {
if(v1->sticky) {
extern float Zmulx, Zmuly;
float *o1, *o2, *o3, hox, hoy, l, dl, u, v;
@@ -2772,17 +2075,17 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
shi.sticky[2]= 0.0;
if(shi.osatex) {
- O.dxuv[0]= s11/Zmulx;
- O.dxuv[1]= - s01/Zmulx;
- O.dyuv[0]= - s10/Zmuly;
- O.dyuv[1]= s00/Zmuly;
+ shi.dxuv[0]= s11/Zmulx;
+ shi.dxuv[1]= - s01/Zmulx;
+ shi.dyuv[0]= - s10/Zmuly;
+ shi.dyuv[1]= s00/Zmuly;
- dl= O.dxuv[0]+O.dxuv[1];
- O.dxsticky[0]= dl*o3[0]-O.dxuv[0]*o1[0]-O.dxuv[1]*o2[0];
- O.dxsticky[1]= dl*o3[1]-O.dxuv[0]*o1[1]-O.dxuv[1]*o2[1];
- dl= O.dyuv[0]+O.dyuv[1];
- O.dysticky[0]= dl*o3[0]-O.dyuv[0]*o1[0]-O.dyuv[1]*o2[0];
- O.dysticky[1]= dl*o3[1]-O.dyuv[0]*o1[1]-O.dyuv[1]*o2[1];
+ dl= shi.dxuv[0]+shi.dxuv[1];
+ shi.dxsticky[0]= dl*o3[0]-shi.dxuv[0]*o1[0]-shi.dxuv[1]*o2[0];
+ shi.dxsticky[1]= dl*o3[1]-shi.dxuv[0]*o1[1]-shi.dxuv[1]*o2[1];
+ dl= shi.dyuv[0]+shi.dyuv[1];
+ shi.dysticky[0]= dl*o3[0]-shi.dyuv[0]*o1[0]-shi.dyuv[1]*o2[0];
+ shi.dysticky[1]= dl*o3[1]-shi.dyuv[0]*o1[1]-shi.dyuv[1]*o2[1];
}
}
}
@@ -2790,21 +2093,21 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
/* ------ main shading loop */
shade_lamp_loop(&shi, &shr);
- if(shi.matren->translucency!=0.0) {
+ if(shi.translucency!=0.0) {
ShadeResult shr_t;
VecMulf(shi.vn, -1.0);
VecMulf(shi.vlr->n, -1.0);
shade_lamp_loop(&shi, &shr_t);
- shr.diff[0]+= shi.matren->translucency*shr_t.diff[0];
- shr.diff[1]+= shi.matren->translucency*shr_t.diff[1];
- shr.diff[2]+= shi.matren->translucency*shr_t.diff[2];
+ shr.diff[0]+= shi.translucency*shr_t.diff[0];
+ shr.diff[1]+= shi.translucency*shr_t.diff[1];
+ shr.diff[2]+= shi.translucency*shr_t.diff[2];
VecMulf(shi.vn, -1.0);
VecMulf(shi.vlr->n, -1.0);
}
if(R.r.mode & R_RAYTRACE) {
- if(shi.matren->ray_mirror!=0.0 || ((shi.mat->mode & MA_RAYTRANSP) && shr.alpha!=1.0)) {
+ if(shi.ray_mirror!=0.0 || ((shi.mat->mode & MA_RAYTRANSP) && shr.alpha!=1.0)) {
ray_trace(&shi, &shr);
}
}
@@ -2817,7 +2120,7 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
/* exposure correction */
if(R.wrld.exp!=0.0 || R.wrld.range!=1.0) {
- if((shi.matren->mode & MA_SHLESS)==0) {
+ if((shi.mat->mode & MA_SHLESS)==0) {
col[0]= R.wrld.linfac*(1.0-exp( col[0]*R.wrld.logfac) );
col[1]= R.wrld.linfac*(1.0-exp( col[1]*R.wrld.logfac) );
col[2]= R.wrld.linfac*(1.0-exp( col[2]*R.wrld.logfac) );
@@ -2825,7 +2128,7 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
}
/* MIST */
- if( (R.wrld.mode & WO_MIST) && (shi.matren->mode & MA_NOMIST)==0 ){
+ if( (R.wrld.mode & WO_MIST) && (shi.mat->mode & MA_NOMIST)==0 ){
alpha= mistfactor(shi.co);
}
else alpha= 1.0;
@@ -2873,39 +2176,24 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
return vlr;
}
-void shadepixel_short(float x, float y, int vlaknr, int mask, unsigned short *shortcol)
+static void shadepixel_sky(float x, float y, int vlaknr, int mask, float *colf)
{
- float colf[4];
+ float collector[4];
shadepixel(x, y, vlaknr, mask, colf);
-
- if(colf[0]<=0.0) shortcol[0]= 0; else if(colf[0]>=1.0) shortcol[0]= 65535;
- else shortcol[0]= 65535.0*colf[0];
- if(colf[1]<=0.0) shortcol[1]= 0; else if(colf[1]>=1.0) shortcol[1]= 65535;
- else shortcol[1]= 65535.0*colf[1];
- if(colf[2]<=0.0) shortcol[2]= 0; else if(colf[2]>=1.0) shortcol[2]= 65535;
- else shortcol[2]= 65535.0*colf[2];
- if(colf[3]<=0.0) shortcol[3]= 0; else if(colf[3]>=1.0) shortcol[3]= 65535;
- else shortcol[3]= 65535.0*colf[3];
-
- if(usegamtab) {
- shortcol[0]= igamtab2[ shortcol[0] ];
- shortcol[1]= igamtab2[ shortcol[1] ];
- shortcol[2]= igamtab2[ shortcol[2] ];
- shortcol[3]= igamtab2[ shortcol[3] ];
- }
-
- if(R.r.dither_intensity!=0.0) {
- short dither_value = (short)((BLI_frand() -.5)*R.r.dither_intensity*256.0);
- /* no dither for color 0 or 255, is OK. intensity is <= 2.0 */
- if(shortcol[0]>255 && shortcol[0] < 65280) shortcol[0]+= dither_value;
- if(shortcol[1]>255 && shortcol[1] < 65280) shortcol[1]+= dither_value;
- if(shortcol[2]>255 && shortcol[2] < 65280) shortcol[2]+= dither_value;
- }
-
+ if(colf[3] != 1.0) {
+ renderSkyPixelFloat(collector, x, y);
+ addAlphaOverFloat(collector, colf);
+ QUATCOPY(colf, collector);
+ }
}
-PixStr *addpsmain()
+/* ************* pixel struct ******** */
+
+PixStrMain psmfirst;
+int psmteller;
+
+static PixStr *addpsmain(void)
{
PixStrMain *psm;
@@ -2925,7 +2213,7 @@ PixStr *addpsmain()
return psm->ps;
}
-void freeps()
+static void freeps(void)
{
PixStrMain *psm,*next;
@@ -2945,7 +2233,7 @@ void freeps()
psmfirst.ps= 0;
}
-void addps(long *rd, int vlak, unsigned int z, short ronde)
+static void addps(long *rd, int vlak, unsigned int z, short ronde)
{
static PixStr *prev;
PixStr *ps, *last = NULL;
@@ -2995,67 +2283,11 @@ void addps(long *rd, int vlak, unsigned int z, short ronde)
int count_mask(unsigned short mask)
{
+ extern char cmask[256];
return (cmask[mask & 255]+cmask[mask>>8]);
}
-float count_maskf(unsigned short mask)
-{
- return (fmask[mask & 255]+fmask[mask>>8]);
-}
-
-
-void add_filt_mask(unsigned int mask, unsigned short *col, unsigned int *rb1, unsigned int *rb2, unsigned int *rb3)
-{
- /* calc the value of mask */
- unsigned int a, maskand, maskshift;
- int j;
- unsigned short val, r, g, b, al;
-
- al= col[3];
- r= col[0];
- g= col[1];
- b= col[2];
-
- maskand= (mask & 255);
- maskshift= (mask >>8);
-
- for(j=2; j>=0; j--) {
-
- a= j;
-
- val= *(mask1[a] +maskand) + *(mask2[a] +maskshift);
- if(val) {
- rb1[3]+= val*al;
- rb1[0]+= val*r;
- rb1[1]+= val*g;
- rb1[2]+= val*b;
- }
- a+=3;
-
- val= *(mask1[a] +maskand) + *(mask2[a] +maskshift);
- if(val) {
- rb2[3]+= val*al;
- rb2[0]+= val*r;
- rb2[1]+= val*g;
- rb2[2]+= val*b;
- }
- a+=3;
-
- val= *(mask1[a] +maskand) + *(mask2[a] +maskshift);
- if(val) {
- rb3[3]+= val*al;
- rb3[0]+= val*r;
- rb3[1]+= val*g;
- rb3[2]+= val*b;
- }
-
- rb1+= 4;
- rb2+= 4;
- rb3+= 4;
- }
-}
-
-void edge_enhance(void)
+static void edge_enhance(void)
{
/* use zbuffer to define edges, add it to the image */
int val, y, x, col, *rz, *rz1, *rz2, *rz3;
@@ -3074,7 +2306,6 @@ void edge_enhance(void)
rz1= (int *)R.rectz;
rz2= rz1+R.rectx;
rz3= rz2+R.rectx;
- rz= (int *)R.rectot+R.rectx;
if(R.r.mode & R_OSA) {
cp= (char *)(R.rectaccu+R.rectx);
@@ -3082,12 +2313,10 @@ void edge_enhance(void)
else {
cp= (char *)(R.rectot+R.rectx);
}
-
- /* rz itself does not seem to be used. */
+ cp+= 4;
for(y=0; y<R.recty-2; y++) {
- rz++;
for(x=0; x<R.rectx-2; x++, rz++, rz1++, rz2++, rz3++, cp+=4) {
col= abs(12*rz2[1]-rz1[0]-2*rz1[1]-rz1[2]-2*rz2[0]-2*rz2[2]-rz3[0]-2*rz3[1]-rz3[2])/3;
@@ -3129,25 +2358,135 @@ void edge_enhance(void)
}
/* ********************* MAINLOOPS ******************** */
+struct renderlineDA {
+ long *rd;
+ unsigned int *rz;
+ float *rb1, *rb2, *rb3;
+ float *acol;
+ int y;
+};
+
+static int do_renderlineDA(void *poin)
+{
+ struct renderlineDA *rl= poin;
+ PixStr *ps;
+ float xs, ys;
+ float fcol[4], *acol=NULL;
+ long *rd= rl->rd;
+ int samp, curmask, face, mask, fullmask;
+ int b, x, full_osa, face0;
+
+ fullmask= (1<<R.osa)-1;
+
+ if(R.flag & R_ZTRA) { /* zbuf tra */
+ abufsetrow(rl->acol, rl->y);
+ acol= rl->acol;
+ }
+
+ for(x=0; x<R.rectx; x++, rd++) {
+
+ if( IS_A_POINTER_CODE(*rd))
+ ps= (PixStr *) POINTER_FROM_CODE(*rd);
+ else ps= NULL;
+
+ if(ps) face0= ps->vlak0;
+ else face0= (int)*rd;
+ mask= 0;
+
+ /* complex loop, because first pixelstruct has a vlak0, without mask */
+ while(TRUE) {
+
+ if(ps==NULL) {
+ face= face0;
+ curmask= (~mask) & fullmask;
+ }
+ else {
+ face= ps->vlak;
+ curmask= ps->mask;
+ }
+
+ /* check osa level */
+ if(face==0) full_osa= 0;
+ else {
+ VlakRen *vlr= RE_findOrAddVlak( (face-1) & 0x7FFFFF);
+ full_osa= (vlr->flag & R_FULL_OSA);
+ }
+
+ if(full_osa) {
+ for(samp=0; samp<R.osa; samp++) {
+ if(curmask & (1<<samp)) {
+ xs= (float)x + jit[samp][0];
+ ys= (float)rl->y + jit[samp][1];
+ shadepixel_sky(xs, ys, face, (1<<samp), fcol);
+
+ if(acol && acol[3]!=0.0) addAlphaOverFloat(fcol, acol);
+ if(do_gamma) {
+ fcol[0]= gammaCorrect(fcol[0]);
+ fcol[1]= gammaCorrect(fcol[1]);
+ fcol[2]= gammaCorrect(fcol[2]);
+ }
+ add_filt_fmask(1<<samp, fcol, rl->rb1, rl->rb2, rl->rb3);
+ }
+ }
+ }
+ else {
+ extern char *centmask; // initrender.c
+ extern float centLut[16];
+
+ b= centmask[curmask];
+ xs= (float)x+centLut[b & 15];
+ ys= (float)rl->y+centLut[b>>4];
+ shadepixel_sky(xs, ys, face, curmask, fcol);
+
+ if(acol && acol[3]!=0.0) addAlphaOverFloat(fcol, acol);
+
+ if(do_gamma) {
+ fcol[0]= gammaCorrect(fcol[0]);
+ fcol[1]= gammaCorrect(fcol[1]);
+ fcol[2]= gammaCorrect(fcol[2]);
+ }
+ add_filt_fmask(curmask, fcol, rl->rb1, rl->rb2, rl->rb3);
+ }
+
+ mask |= curmask;
+
+ if(ps==NULL) break;
+ else ps= ps->next;
+ }
+
+ rl->rb1+=4;
+ rl->rb2+=4;
+ rl->rb3+=4;
+ if(acol) acol+=4;
+ }
+
+ if(R.flag & R_HALO) {
+ /* from these pixels the pixstr is 1 scanline old */
+ scanlinehaloPS(rl->rz, rl->rd, rl->rb2-4*R.rectx + 4, rl->y);
+ }
+
+ return 1;
+}
-extern unsigned short *Acolrow;
-/* short zbuffermetdehand(); */
void zbufshadeDA(void) /* Delta Accum Pixel Struct */
{
extern float Zjitx,Zjity;
- PixStr *ps;
- float xd, yd, xs, ys;
- unsigned int *rz, *rp, *rt, mask, fullmask;
- unsigned int *rowbuf1, *rowbuf2, *rowbuf3, *rb1, *rb2, *rb3;
- int a, b;
+ struct renderlineDA rl1, rl2;
+ float xd, yd, *rf;
long *rd;
- unsigned short *colrb, *acol, shortcol[4];
+ unsigned int *rz, *rp, *rt;
+ float *rowbuf1, *rowbuf2, *rowbuf3, *rowbuf0, *rowbuf1a, *rowbuf2a, *rb3;
+ int a;
short v, x, y;
- char *colrt, tempcol[4];
R.rectdaps= MEM_callocN(sizeof(long)*R.rectx*R.recty+4,"zbufDArectd");
- if(R.flag & R_ZTRA) bgnaccumbuf();
-
+
+ if(R.flag & R_ZTRA) {
+ bgnaccumbuf();
+ rl1.acol= MEM_callocN((R.rectx+4)*4*sizeof(float), "Acol");
+ rl2.acol= MEM_callocN((R.rectx+4)*4*sizeof(float), "Acol");
+ }
+
psmteller= 0;
if(R.r.mode & R_EDGE) {
@@ -3195,6 +2534,7 @@ void zbufshadeDA(void) /* Delta Accum Pixel Struct */
if(RE_local_test_break()) break;
}
+
if(R.flag & (R_ZTRA+R_HALO) ) { /* to get back correct values of zbuffer Z for transp and halos */
xd= jit[0][0];
yd= jit[0][1];
@@ -3207,169 +2547,186 @@ void zbufshadeDA(void) /* Delta Accum Pixel Struct */
rd= R.rectdaps;
rz= R.rectz;
- colrt= (char *)R.rectot;
-
+ rt= R.rectot;
+ rf= R.rectftot;
- fullmask= (1<<R.osa)-1;
/* the rowbuf is 4 pixels larger than an image! */
- rowbuf1= MEM_callocN(3*(R.rectx+4)*4*sizeof(float), "ZbufshadeDA3");
- rowbuf2= MEM_callocN(3*(R.rectx+4)*4*sizeof(float), "ZbufshadeDA3");
- rowbuf3= MEM_callocN(3*(R.rectx+4)*4*sizeof(float), "ZbufshadeDA3");
-
- for(y=0;y<=R.recty;y++) {
+ rowbuf0= MEM_callocN((R.rectx+4)*4*sizeof(float), "ZbufshadeDA3");
+ rowbuf1= MEM_callocN((R.rectx+4)*4*sizeof(float), "ZbufshadeDA3");
+ rowbuf2= MEM_callocN((R.rectx+4)*4*sizeof(float), "ZbufshadeDA3");
+ rowbuf1a= MEM_callocN((R.rectx+4)*4*sizeof(float), "ZbufshadeDA3");
+ rowbuf2a= MEM_callocN((R.rectx+4)*4*sizeof(float), "ZbufshadeDA3");
+ rowbuf3= MEM_callocN((R.rectx+4)*4*sizeof(float), "ZbufshadeDA3");
- rb1= rowbuf1;
- rb2= rowbuf2;
- rb3= rowbuf3;
+ for(y=0; y<=R.recty; y++, rd+=R.rectx, rt+=R.rectx, rz+= R.rectx) {
if(y<R.recty) {
- for(x=0; x<R.rectx; x++, rd++) {
- int samp, curmask, face;
- int full_osa, face0;
-
- if( IS_A_POINTER_CODE(*rd))
- ps= (PixStr *) POINTER_FROM_CODE(*rd);
- else ps= NULL;
-
- if(ps) face0= ps->vlak0;
- else face0= (int)*rd;
- mask= 0;
-
- /* complex loop, because first pixelstruct has a vlak0, without mask */
- while(TRUE) {
-
- if(ps==NULL) {
- face= face0;
- curmask= (~mask) & fullmask;
- }
- else {
- face= ps->vlak;
- curmask= ps->mask;
+ rl1.rd= rd;
+ rl1.rz= rz;
+ rl1.y= y;
+ rl1.rb1= rowbuf1;
+ rl1.rb2= rowbuf2;
+ rl1.rb3= rowbuf3;
+
+ if(R.r.mode & R_THREADS) {
+ if((y & 1)==0) {
+ SDL_Thread *thread;
+
+ thread = SDL_CreateThread(do_renderlineDA, &rl1);
+ if ( thread == NULL ) {
+ fprintf(stderr, "Unable to create thread");
+ G.afbreek= 1;
+ break;
}
- /* check osa level */
- if(face==0) full_osa= 0;
- else {
- VlakRen *vlr= RE_findOrAddVlak( (face-1) & 0x7FFFFF);
- full_osa= (vlr->flag & R_FULL_OSA);
- }
+ rl2.rd= rd+R.rectx;
+ rl2.rz= rz+R.rectx;
+ rl2.y= y+1;
+ rl2.rb1= rowbuf0;
+ rl2.rb2= rowbuf1a;
+ rl2.rb3= rowbuf2a;
- if(full_osa) {
- for(samp=0; samp<R.osa; samp++) {
- if(curmask & (1<<samp)) {
- xs= (float)x + jit[samp][0];
- ys= (float)y + jit[samp][1];
- shadepixel_short(xs, ys, face, (1<<samp), shortcol);
-
- if(shortcol[3]) add_filt_mask(1<<samp, shortcol, rb1, rb2, rb3);
- }
+ do_renderlineDA(&rl2);
+ SDL_WaitThread(thread, NULL);
+
+ if(R.r.mode & R_GAUSS) {
+ float *rb1= rowbuf1, *rb2= rowbuf2, *rb1a= rowbuf1a, *rb2a= rowbuf2a;
+ a= 4*(R.rectx + 4);
+ while(a--) {
+ *rb1 += *rb1a;
+ *rb2 += *rb2a;
+ *(rb1a++)= 0; rb1++;
+ *(rb2a++)= 0; rb2++;
}
}
else {
- b= centmask[curmask];
- xs= (float)x+centLut[b & 15];
- ys= (float)y+centLut[b>>4];
- shadepixel_short(xs, ys, face, curmask, shortcol);
-
- if(shortcol[3]) add_filt_mask(curmask, shortcol, rb1, rb2, rb3);
+ SWAP(float *, rowbuf1a, rowbuf1);
}
-
- mask |= curmask;
-
- if(ps==NULL) break;
- else ps= ps->next;
}
- rb1+=4;
- rb2+=4;
- rb3+=4;
}
+ else do_renderlineDA(&rl1);
+
}
+ /* convert 4x32 bits buffer to 4x8, add halos. this can't be threaded due to gauss */
if(y>0) {
-
- colrb= (unsigned short *)(rowbuf3+4);
-
- /* WATCH IT: ENDIAN */
-
- for(x=0; x<R.rectx; x++,colrt+=4) {
- colrt[0]= ( (char *) (gamtab+colrb[0+MOST_SIG_BYTE]) )[MOST_SIG_BYTE];
- colrt[1]= ( (char *) (gamtab+colrb[2+MOST_SIG_BYTE]) )[MOST_SIG_BYTE];
- colrt[2]= ( (char *) (gamtab+colrb[4+MOST_SIG_BYTE]) )[MOST_SIG_BYTE];
- colrt[3]= ( (char *) (gamtab+colrb[6+MOST_SIG_BYTE]) )[MOST_SIG_BYTE];
- colrb+= 8;
- }
- if(R.flag & R_ZTRA) {
- abufsetrow(y-1);
- acol= Acolrow;
- colrt-= 4*R.rectx;
-
- for(x=0; x<R.rectx; x++, colrt+=4, acol+=4) {
- if(acol[3]) {
- tempcol[0]= (acol[0]>>8);
- tempcol[1]= (acol[1]>>8);
- tempcol[2]= (acol[2]>>8);
- tempcol[3]= (acol[3]>>8);
- addalphaOver(colrt, tempcol);
- }
- }
+ transferColourBufferToOutput(rowbuf3+4, y-1);
+ if(R.rectftot) {
+ memcpy(rf, rowbuf3+4, 4*sizeof(float)*R.rectx);
+ rf+= 4*R.rectx;
}
- if(R.flag & R_HALO) {
- /* from these pixels the pixstr is 1 scanline old */
- scanlinehaloPS(rz-R.rectx, rd-2*R.rectx, ((unsigned int *)colrt)-R.rectx, y-1);
-
- }
- scanlinesky(colrt-4*R.rectx, y-1);
-
}
if(y<R.recty) {
- memset(rowbuf3, 0, (R.rectx+4)*4*4);
+ memset(rowbuf3, 0, (R.rectx+4)*4*sizeof(int));
rb3= rowbuf3;
rowbuf3= rowbuf2;
rowbuf2= rowbuf1;
- rowbuf1= rb3;
+ rowbuf1= rowbuf0;
+ rowbuf0= rb3;
if( y>0) {
if((y & 1)==0) {
RE_local_render_display(y-2, y-1, R.rectx, R.recty, R.rectot);
}
}
- rz+= R.rectx;
}
if(RE_local_test_break()) break;
}
if( (R.r.mode & R_EDGE) && RE_local_test_break()==0) {
- rt= R.rectot;
- rp= R.rectaccu;
- for(a= R.rectx*R.recty; a>0; a--, rt++, rp++) {
- addalphaOver((char *)rt, (char *)rp);
+ if(R.rectftot) {
+ float *rtf= R.rectftot, colf[4];
+ rp= R.rectaccu;
+ for(a= R.rectx*R.recty; a>0; a--, rtf+=4, rp++) {
+ cpCharColV2FloatColV((char *)rp, colf);
+ addAlphaOverFloat(rtf, colf);
+ }
+ RE_floatbuffer_to_output();
+ }
+ else {
+ rt= R.rectot;
+ rp= R.rectaccu;
+ for(a= R.rectx*R.recty; a>0; a--, rt++, rp++) {
+ addalphaOver((char *)rt, (char *)rp);
+ }
}
}
MEM_freeN(R.rectdaps);
freeps();
+ MEM_freeN(rowbuf0);
MEM_freeN(rowbuf1);
MEM_freeN(rowbuf2);
+ MEM_freeN(rowbuf1a);
+ MEM_freeN(rowbuf2a);
MEM_freeN(rowbuf3);
- R.rectdaps= 0;
+ R.rectdaps= NULL;
if(R.r.mode & R_EDGE) if(R.rectaccu) MEM_freeN(R.rectaccu);
- R.rectaccu= 0;
- if(R.flag & R_ZTRA) endaccumbuf();
+ R.rectaccu= NULL;
+ if(R.flag & R_ZTRA) {
+ endaccumbuf();
+ MEM_freeN(rl1.acol);
+ MEM_freeN(rl2.acol);
+ }
} /* end of void zbufshadeDA() */
/* ------------------------------------------------------------------------ */
+struct renderline {
+ float *rowbuf, *acol;
+ unsigned int *rp, *rz;
+ short ys;
+ float y;
+};
+
+static int do_renderline(void *poin)
+{
+ struct renderline *rl= poin;
+ float *fcol= rl->rowbuf;
+ float *acol=NULL;
+ int x;
+
+ if(R.flag & R_ZTRA) { /* zbuf tra */
+ abufsetrow(rl->acol, rl->ys);
+ acol= rl->acol;
+ }
+
+ for(x=0; x<R.rectx; x++, (rl->rp)++, fcol+=4) {
+
+ shadepixel_sky((float)x, rl->y, *(rl->rp), 0, fcol);
+ if(acol) {
+ if(acol[3]!=0.0) addAlphaOverFloat(fcol, acol);
+ acol+= 4;
+ }
+ }
+
+ if(R.flag & R_HALO) {
+ scanlinehalo(rl->rz, rl->rowbuf, rl->ys);
+ }
+
+ transferColourBufferToOutput(rl->rowbuf, rl->y);
+
+ if(R.rectftot) {
+ memcpy(R.rectftot + 4*rl->ys*R.rectx, rl->rowbuf, 4*sizeof(float)*R.rectx);
+ }
+
+ return 1;
+}
+
+
void zbufshade(void)
{
+ struct renderline rl1, rl2;
extern float Zjitx,Zjity;
unsigned int *rz,*rp;
float fy;
- int x,y;
- unsigned short *acol, shortcol[4];
- char *charcol, *rt;
+ int y;
+ rl1.rowbuf= MEM_callocN((R.rectx+4)*4*sizeof(float), "Zbufshade");
+ rl2.rowbuf= MEM_callocN((R.rectx+4)*4*sizeof(float), "Zbufshade");
+
Zjitx=Zjity= -0.5;
zbufferall();
@@ -3377,84 +2734,93 @@ void zbufshade(void)
/* SHADE */
rp= R.rectot;
rz= R.rectz;
- charcol= (char *)shortcol;
-
- #ifdef BBIG_ENDIAN
- #else
- charcol++; /* short is read different then */
- #endif
- if(R.flag & R_ZTRA) bgnaccumbuf();
+ if(R.flag & R_ZTRA) {
+ rl1.acol= MEM_callocN((R.rectx+4)*4*sizeof(float), "Acol");
+ rl2.acol= MEM_callocN((R.rectx+4)*4*sizeof(float), "Acol");
+ bgnaccumbuf();
+ }
for(y=0; y<R.recty; y++) {
fy= y;
- if(R.flag & R_ZTRA) { /* zbuf tra */
- abufsetrow(y);
- acol= Acolrow;
+ rl1.rp= rp;
+ rl1.rz= rz;
+ rl1.y= fy;
+ rl1.ys= y;
+
+ if(R.r.mode & R_THREADS) {
+ SDL_Thread *thread;
- for(x=0; x<R.rectx; x++, rp++, acol+= 4) {
-
- shadepixel_short((float)x, fy, *rp, 0, shortcol);
-
- if(acol[3]) addAlphaOverShort(shortcol, acol);
-
- if(shortcol[3]) {
- rt= (char *)rp;
- rt[0]= charcol[0];
- rt[1]= charcol[2];
- rt[2]= charcol[4];
- rt[3]= charcol[6];
- }
- else *rp= 0;
+ thread = SDL_CreateThread(do_renderline, &rl1);
+ if ( thread == NULL ) {
+ fprintf(stderr, "Unable to create thread");
+ G.afbreek= 1;
+ break;
}
+ rp+= R.rectx;
+ rz+= R.rectx;
+
+ if(y < R.recty-1) {
+ rl2.rp= rp;
+ rl2.rz= rz;
+ rl2.y= fy+1.0;
+ rl2.ys= y+1;
+ do_renderline(&rl2);
+ rp+= R.rectx;
+ rz+= R.rectx;
+ y++;
+ }
+ SDL_WaitThread(thread, NULL);
}
else {
- for(x=0; x<R.rectx; x++, rp++) {
- shadepixel_short((float)x, fy, *rp, 0, shortcol);
- if(shortcol[3]) {
- rt= (char *)rp;
- rt[0]= charcol[0];
- rt[1]= charcol[2];
- rt[2]= charcol[4];
- rt[3]= charcol[6];
- }
- else *rp= 0;
- }
+ do_renderline(&rl1);
+ rp+= R.rectx;
+ rz+= R.rectx;
}
- if(R.flag & R_HALO) {
- scanlinehalo(rz, (rp-R.rectx), y);
- rz+= R.rectx;
- }
- scanlinesky( (char *)(rp-R.rectx), y);
-
if(y & 1) {
RE_local_render_display(y-1, y, R.rectx, R.recty, R.rectot);
}
if(RE_local_test_break()) break;
}
-
- if(R.flag & R_ZTRA) endaccumbuf();
+
+ MEM_freeN(rl1.rowbuf);
+ MEM_freeN(rl2.rowbuf);
+
+ if(R.flag & R_ZTRA) {
+ endaccumbuf();
+ MEM_freeN(rl1.acol);
+ MEM_freeN(rl2.acol);
+ }
if(R.r.mode & R_EDGE) edge_enhance();
- /* if((R.flag & R_HALO) && blender_test_break()==0) halovert(); */
-
} /* end of void zbufshade() */
/* ------------------------------------------------------------------------ */
-void renderhalo(HaloRen *har) /* postprocess version */
+void RE_shadehalo(HaloRen *har, char *col, float *colf, unsigned int zz, float dist, float xn, float yn, short flarec)
{
+
+ shadeHaloFloat(har, colf, zz, dist, xn, yn, flarec);
- float dist, xsq, ysq, xn, yn;
+ if(colf[0]<=0.0) col[0]= 0; else if(colf[0]>=1.0) col[0]= 255; else col[0]= 255.0*colf[0];
+ if(colf[1]<=0.0) col[1]= 0; else if(colf[1]>=1.0) col[1]= 255; else col[1]= 255.0*colf[1];
+ if(colf[2]<=0.0) col[2]= 0; else if(colf[2]>=1.0) col[2]= 255; else col[2]= 255.0*colf[2];
+ if(colf[3]<=0.0) col[3]= 0; else if(colf[3]>=1.0) col[3]= 255; else col[3]= 255.0*colf[3];
+
+}
+
+static void renderhalo(HaloRen *har) /* postprocess version */
+{
+
+ float dist, xsq, ysq, xn, yn, colf[4], *rectft, *rtf;
unsigned int *rectt, *rt;
int minx, maxx, miny, maxy, x, y;
char col[4];
-
har->miny= miny= har->ys - har->rad/R.ycor;
har->maxy= maxy= har->ys + har->rad/R.ycor;
@@ -3474,11 +2840,13 @@ void renderhalo(HaloRen *har) /* postprocess version */
if(maxy>R.recty) maxy= R.recty;
rectt= R.rectot+ R.rectx*miny;
+ rectft= R.rectftot+ 4*R.rectx*miny;
+
+ for(y=miny; y<maxy; y++) {
- for(y=miny;y<maxy;y++) {
-
- rt= (rectt+minx);
-
+ rt= rectt+minx;
+ rtf= rectft+4*minx;
+
yn= (y - har->ys)*R.ycor;
ysq= yn*yn;
@@ -3487,22 +2855,26 @@ void renderhalo(HaloRen *har) /* postprocess version */
xsq= xn*xn;
dist= xsq+ysq;
if(dist<har->radsq) {
- RE_shadehalo(har, col, 0, dist, xn, yn, har->flarec);
-
- RE_addalphaAddfac((char *)rt, col, har->add);
+
+ shadeHaloFloat(har, colf, 0, dist, xn, yn, har->flarec);
+ if(R.rectftot) addalphaAddfacFloat(rtf, colf, har->add);
+ else {
+ std_floatcol_to_charcol(colf, col);
+ RE_addalphaAddfac((char *)rt, col, har->add);
+ }
}
rt++;
+ rtf+=4;
}
rectt+= R.rectx;
+ rectft+= 4*R.rectx;
if(RE_local_test_break()) break;
}
-
}
}
-} /* end of void renderhalo(HaloRen *har), postprocess version */
-
+}
/* ------------------------------------------------------------------------ */
void RE_renderflare(HaloRen *har)
@@ -3541,9 +2913,9 @@ void RE_renderflare(HaloRen *har)
for(b=1; b<har->flarec; b++) {
- fla.r= fabs(255.0*rc[0]);
- fla.g= fabs(255.0*rc[1]);
- fla.b= fabs(255.0*rc[2]);
+ fla.r= fabs(rc[0]);
+ fla.g= fabs(rc[1]);
+ fla.b= fabs(rc[2]);
fla.alfa= ma->flareboost*fabs(alfa*visifac*rc[3]);
fla.hard= 20.0 + fabs(70*rc[7]);
fla.tex= 0;
@@ -3609,7 +2981,9 @@ void add_halo_flare(void)
}
R.r.mode= mode;
-} /* end of void add_halo_flare() */
+
+ if(R.rectftot) RE_floatbuffer_to_output();
+}
/* end of render.c */
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index b717029c4ba..00fff240fb9 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -59,18 +59,17 @@
#include <math.h>
#include <string.h>
+
#include "MEM_guardedalloc.h"
+#include "BKE_utildefines.h"
#include "BLI_arithb.h"
+#include "DNA_material_types.h"
#include "DNA_texture_types.h"
+
#include "BKE_texture.h"
#include "render.h"
-#include "render_intern.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
/* ------------------------------------------------------------------------- */
@@ -176,16 +175,12 @@ VlakRen *RE_findOrAddVlak(int nr)
/* ------------------------------------------------------------------------- */
-extern float Tin, Tr, Tg, Tb;
-HaloRen *RE_inithalo(Material *ma,
- float *vec,
- float *vec1,
- float *orco,
- float hasize,
- float vectsize)
+HaloRen *RE_inithalo(Material *ma, float *vec, float *vec1,
+ float *orco, float hasize, float vectsize, int seed)
{
HaloRen *har;
MTex *mtex;
+ float tin, tr, tg, tb, ta;
float xn, yn, zn, texvec[3], hoco[4], hoco1[4];
if(hasize==0) return 0;
@@ -213,7 +208,7 @@ HaloRen *RE_inithalo(Material *ma,
har->ys= 0.5*R.recty*(hoco[1]/zn);
har->zs= 0x7FFFFF*(1.0+hoco[2]/zn);
- har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
+ har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
xn= har->xs - 0.5*R.rectx*(hoco1[0]/hoco1[3]);
yn= har->ys - 0.5*R.recty*(hoco1[1]/hoco1[3]);
@@ -233,13 +228,13 @@ HaloRen *RE_inithalo(Material *ma,
if(ma->mode & MA_HALO_XALPHA) har->type |= HA_XALPHA;
har->alfa= ma->alpha;
- har->r= 255.0*ma->r;
- har->g= 255.0*ma->g;
- har->b= 255.0*ma->b;
- har->add= 255.0*ma->add;
- har->mat= ma->ren;
+ har->r= ma->r;
+ har->g= ma->g;
+ har->b= ma->b;
+ har->add= (255.0*ma->add);
+ har->mat= ma;
har->hard= ma->har;
- har->seed= ma->ren->seed1 % 256;
+ har->seed= seed % 256;
if(ma->mode & MA_STAR) har->starpoints= ma->starc;
if(ma->mode & MA_HALO_LINES) har->linec= ma->linec;
@@ -270,19 +265,19 @@ HaloRen *RE_inithalo(Material *ma,
}
}
- externtex(mtex, texvec);
+ externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta);
- yn= Tin*mtex->colfac;
- zn= Tin*mtex->varfac;
+ yn= tin*mtex->colfac;
+ zn= tin*mtex->varfac;
if(mtex->mapto & MAP_COL) {
zn= 1.0-yn;
- har->r= 255.0*(yn*Tr+ zn*ma->r);
- har->g= 255.0*(yn*Tg+ zn*ma->g);
- har->b= 255.0*(yn*Tb+ zn*ma->b);
+ har->r= (yn*tr+ zn*ma->r);
+ har->g= (yn*tg+ zn*ma->g);
+ har->b= (yn*tb+ zn*ma->b);
}
if(mtex->texco & 16) {
- har->alfa= 255.0*Tin;
+ har->alfa= tin;
}
}
}
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index b1f8a246a85..b87635a51c2 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -42,38 +42,32 @@
#include "MTC_matrixops.h"
#include "MEM_guardedalloc.h"
-#include "BLI_arithb.h"
#include "DNA_lamp_types.h"
+#include "BKE_utildefines.h"
+#include "BLI_arithb.h"
#include "render.h"
-#include "render_intern.h"
#include "shadbuf.h"
#include "renderHelp.h"
#include "jitter.h"
#include "zbuf.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
+/* XXX, could be better implemented...
+*/
+#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__)
+#define RCOMP 3
+#define GCOMP 2
+#define BCOMP 1
+#define ACOMP 0
+#else
+#define RCOMP 0
+#define GCOMP 1
+#define BCOMP 2
+#define ACOMP 3
#endif
-/* if defined: objects don't cast shadows anymore */
-/* #define RE_NO_SHADOWS */
-
-/* unused? */
-static int bias= 0x00500000;
-/* crud */
-#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
-
-/* ------------------------------------------------------------------------- */
-
-void lrectreadRectz(int x1, int y1, int x2, int y2, char *r1);
-int sizeoflampbuf(struct ShadBuf *shb);
-int firstreadshadbuf(struct ShadBuf *shb, int xs, int ys, int nr);
-float readshadowbuf(struct ShadBuf *shb, int xs, int ys, int zs);
-float readshadowbuf_halo(struct ShadBuf *shb, int xs, int ys, int zs);
-float *give_jitter_tab(int samp);
/* ------------------------------------------------------------------------- */
@@ -138,7 +132,7 @@ void RE_initshadowbuf(LampRen *lar, float mat[][4])
/* ------------------------------------------------------------------------- */
-void lrectreadRectz(int x1, int y1, int x2, int y2, char *r1) /* reads part from rectz in r1 */
+static void lrectreadRectz(int x1, int y1, int x2, int y2, char *r1) /* reads part from rectz in r1 */
{
unsigned int len4, *rz;
@@ -154,8 +148,8 @@ void lrectreadRectz(int x1, int y1, int x2, int y2, char *r1) /* reads part from
}
}
-
-int sizeoflampbuf(struct ShadBuf *shb)
+#if 0
+static int sizeoflampbuf(struct ShadBuf *shb)
{
int num,count=0;
char *cp;
@@ -167,8 +161,9 @@ int sizeoflampbuf(struct ShadBuf *shb)
return 256*count;
}
+#endif
-float *give_jitter_tab(int samp)
+static float *give_jitter_tab(int samp)
{
/* these are all possible jitter tables, takes up some
* 12k, not really bad!
@@ -345,7 +340,7 @@ void makeshadowbuf(LampRen *lar)
/* printf("lampbuf %d\n", sizeoflampbuf(shb)); */
}
-int firstreadshadbuf(struct ShadBuf *shb, int xs, int ys, int nr)
+static int firstreadshadbuf(struct ShadBuf *shb, int xs, int ys, int nr)
{
/* return a 1 if fully compressed shadbuf-tile && z==const */
static int *rz;
@@ -372,7 +367,7 @@ int firstreadshadbuf(struct ShadBuf *shb, int xs, int ys, int nr)
return 0;
}
-float readshadowbuf(struct ShadBuf *shb, int xs, int ys, int zs) /* return 1.0 : fully in light */
+static float readshadowbuf(struct ShadBuf *shb, int bias, int xs, int ys, int zs) /* return 1.0 : fully in light */
{
float temp;
int *rz, ofs;
@@ -435,12 +430,13 @@ float readshadowbuf(struct ShadBuf *shb, int xs, int ys, int zs) /* return 1.0 :
}
}
-
-float testshadowbuf(struct ShadBuf *shb, float *rco, float inp) /* return 1.0: no shadow at all */
+/* the externally called shadow testing (reading) function */
+/* return 1.0: no shadow at all */
+float testshadowbuf(struct ShadBuf *shb, float *rco, float *dxco, float *dyco, float inp)
{
float fac, co[4], dx[3], dy[3], aantal=0;
float xs1,ys1, siz, *j, xres, yres;
- int xs,ys, zs;
+ int xs,ys, zs, bias;
short a,num;
/* if(inp <= 0.0) return 1.0; */
@@ -477,20 +473,20 @@ float testshadowbuf(struct ShadBuf *shb, float *rco, float inp) /* return 1.0:
bias= (1.5-inp*inp)*shb->bias;
if(num==1) {
- return readshadowbuf(shb,(int)xs1, (int)ys1, zs);
+ return readshadowbuf(shb, bias, (int)xs1, (int)ys1, zs);
}
- co[0]= rco[0]+O.dxco[0];
- co[1]= rco[1]+O.dxco[1];
- co[2]= rco[2]+O.dxco[2];
+ co[0]= rco[0]+dxco[0];
+ co[1]= rco[1]+dxco[1];
+ co[2]= rco[2]+dxco[2];
co[3]= 1.0;
MTC_Mat4MulVec4fl(shb->persmat,co); /* rational hom co */
dx[0]= xs1- siz*(1.0+co[0]/co[3]);
dx[1]= ys1- siz*(1.0+co[1]/co[3]);
- co[0]= rco[0]+O.dyco[0];
- co[1]= rco[1]+O.dyco[1];
- co[2]= rco[2]+O.dyco[2];
+ co[0]= rco[0]+dyco[0];
+ co[1]= rco[1]+dyco[1];
+ co[2]= rco[2]+dyco[2];
co[3]= 1.0;
MTC_Mat4MulVec4fl(shb->persmat,co); /* rational hom co */
dy[0]= xs1- siz*(1.0+co[0]/co[3]);
@@ -512,7 +508,7 @@ float testshadowbuf(struct ShadBuf *shb, float *rco, float inp) /* return 1.0:
if(firstreadshadbuf(shb, (int)(xs1+xres), (int)ys1, 1)) {
if(firstreadshadbuf(shb, (int)xs1, (int)(ys1+yres), 1)) {
if(firstreadshadbuf(shb, (int)(xs1+xres), (int)(ys1+yres), 1)) {
- return readshadowbuf(shb,(int)xs1, (int)ys1, zs);
+ return readshadowbuf(shb, bias,(int)xs1, (int)ys1, zs);
}
}
}
@@ -526,7 +522,7 @@ float testshadowbuf(struct ShadBuf *shb, float *rco, float inp) /* return 1.0:
ys= ys1 + yres*(j[1] + 0.5);
j+=2;
- aantal+= readshadowbuf(shb, xs, ys, zs);
+ aantal+= readshadowbuf(shb, bias, xs, ys, zs);
}
/* Renormalizes for the sample number: */
@@ -535,13 +531,16 @@ float testshadowbuf(struct ShadBuf *shb, float *rco, float inp) /* return 1.0:
/* different function... sampling behind clipend can be LIGHT, bias is negative! */
/* return: light */
-float readshadowbuf_halo(struct ShadBuf *shb, int xs, int ys, int zs)
+static float readshadowbuf_halo(struct ShadBuf *shb, int xs, int ys, int zs)
{
float temp;
int *rz, ofs;
- int zbias, zsamp;
+ int bias, zbias, zsamp;
char *ct, *cz;
+ /* negative! The other side is more important */
+ bias= -shb->bias;
+
/* simpleclip */
if(xs<0 || ys<0) return 0.0;
if(xs>=shb->size || ys>=shb->size) return 0.0;
@@ -616,8 +615,6 @@ float shadow_halo(LampRen *lar, float *p1, float *p2)
int dx = 0, dy = 0;
siz= 0.5*(float)shb->size;
- /* negative! The other side is more important */
- bias= -shb->bias;
co[0]= p1[0];
co[1]= p1[1];
diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c
index b360def02a6..c30a62c9789 100644
--- a/source/blender/render/intern/source/texture.c
+++ b/source/blender/render/intern/source/texture.c
@@ -62,7 +62,6 @@
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
-#include "BKE_osa_types.h"
#include "BKE_plugin_types.h"
#include "BKE_utildefines.h"
@@ -78,14 +77,66 @@
#include "render.h"
#include "rendercore.h"
#include "envmap.h"
-
-/* These vars form the texture channel */
-float Tin, Tr, Tg, Tb, Ta, Txtra;
-extern int Talpha;
+#include "texture.h"
/* ------------------------------------------------------------------------- */
+int calcimanr(int cfra, Tex *tex)
+{
+ int imanr, len, a, fra, dur;
+
+ /* here (+fie_ima/2-1) makes sure that division happens correctly */
+
+ if(tex->frames==0) return 1;
+
+ cfra= cfra-tex->sfra+1;
+
+ /* cyclic */
+ if(tex->len==0) len= (tex->fie_ima*tex->frames)/2;
+ else len= tex->len;
+
+ if(tex->imaflag & TEX_ANIMCYCLIC) {
+ cfra= ( (cfra) % len );
+ if(cfra < 0) cfra+= len;
+ if(cfra==0) cfra= len;
+ }
+
+ if(cfra<1) cfra= 1;
+ else if(cfra>len) cfra= len;
+
+ /* convert current frame to current field */
+ cfra= 2*(cfra);
+ if(R.flag & R_SEC_FIELD) cfra++;
+
+ /* transform to images space */
+ imanr= (cfra+tex->fie_ima-2)/tex->fie_ima;
+ if(imanr>tex->frames) imanr= tex->frames;
+ imanr+= tex->offset;
+
+ if(tex->imaflag & TEX_ANIMCYCLIC) {
+ imanr= ( (imanr) % len );
+ while(imanr < 0) imanr+= len;
+ if(imanr==0) imanr= len;
+ }
+
+ /* are there images that last longer? */
+ for(a=0; a<4; a++) {
+ if(tex->fradur[a][0]) {
+
+ fra= tex->fradur[a][0];
+ dur= tex->fradur[a][1]-1;
+
+ while(dur>0 && imanr>fra) {
+ imanr--;
+ dur--;
+ }
+ }
+ }
+
+ return imanr;
+}
+
void init_render_texture(Tex *tex)
{
Image *ima;
@@ -93,9 +144,6 @@ void init_render_texture(Tex *tex)
unsigned short numlen;
char name[FILE_MAXDIR+FILE_MAXFILE], head[FILE_MAXDIR+FILE_MAXFILE], tail[FILE_MAXDIR+FILE_MAXFILE];
- /* is also used as signal */
- tex->nor= NULL;
-
/* imap test */
if(tex->frames && tex->ima && tex->ima->name) { /* frames */
strcpy(name, tex->ima->name);
@@ -195,36 +243,36 @@ void end_render_textures()
/* ------------------------------------------------------------------------- */
/* this allows colorbanded textures to control normals as well */
-static void tex_normal_derivate(float fac, Tex *tex)
+static void tex_normal_derivate(Tex *tex, TexResult *texres)
{
if (tex->flag & TEX_COLORBAND) {
float col[4];
- if (do_colorband(tex->coba, fac, col)) {
+ if (do_colorband(tex->coba, texres->tin, col)) {
float fac0, fac1, fac2, fac3;
fac0= (col[0]+col[1]+col[2]);
- do_colorband(tex->coba, tex->nor[0], col);
+ do_colorband(tex->coba, texres->nor[0], col);
fac1= (col[0]+col[1]+col[2]);
- do_colorband(tex->coba, tex->nor[1], col);
+ do_colorband(tex->coba, texres->nor[1], col);
fac2= (col[0]+col[1]+col[2]);
- do_colorband(tex->coba, tex->nor[2], col);
+ do_colorband(tex->coba, texres->nor[2], col);
fac3= (col[0]+col[1]+col[2]);
- tex->nor[0]= 0.3333*(fac0 - fac1);
- tex->nor[1]= 0.3333*(fac0 - fac2);
- tex->nor[2]= 0.3333*(fac0 - fac3);
+ texres->nor[0]= 0.3333*(fac0 - fac1);
+ texres->nor[1]= 0.3333*(fac0 - fac2);
+ texres->nor[2]= 0.3333*(fac0 - fac3);
return;
}
}
- tex->nor[0]= fac - tex->nor[0];
- tex->nor[1]= fac - tex->nor[1];
- tex->nor[2]= fac - tex->nor[2];
+ texres->nor[0]= texres->tin - texres->nor[0];
+ texres->nor[1]= texres->tin - texres->nor[1];
+ texres->nor[2]= texres->tin - texres->nor[2];
}
-static int blend(Tex *tex, float *texvec)
+static int blend(Tex *tex, float *texvec, TexResult *texres)
{
float x, y, t;
@@ -238,32 +286,32 @@ static int blend(Tex *tex, float *texvec)
}
if(tex->stype==0) { /* lin */
- Tin= (1.0+x)/2.0;
+ texres->tin= (1.0+x)/2.0;
}
else if(tex->stype==1) { /* quad */
- Tin= (1.0+x)/2.0;
- if(Tin<0.0) Tin= 0.0;
- else Tin*= Tin;
+ texres->tin= (1.0+x)/2.0;
+ if(texres->tin<0.0) texres->tin= 0.0;
+ else texres->tin*= texres->tin;
}
else if(tex->stype==2) { /* ease */
- Tin= (1.0+x)/2.0;
- if(Tin<=.0) Tin= 0.0;
- else if(Tin>=1.0) Tin= 1.0;
+ texres->tin= (1.0+x)/2.0;
+ if(texres->tin<=.0) texres->tin= 0.0;
+ else if(texres->tin>=1.0) texres->tin= 1.0;
else {
- t= Tin*Tin;
- Tin= (3.0*t-2.0*t*Tin);
+ t= texres->tin*texres->tin;
+ texres->tin= (3.0*t-2.0*t*texres->tin);
}
}
else if(tex->stype==3) { /* diag */
- Tin= (2.0+x+y)/4.0;
+ texres->tin= (2.0+x+y)/4.0;
}
else { /* sphere */
- Tin= 1.0-sqrt(x*x+ y*y+texvec[2]*texvec[2]);
- if(Tin<0.0) Tin= 0.0;
- if(tex->stype==5) Tin*= Tin; /* halo */
+ texres->tin= 1.0-sqrt(x*x+ y*y+texvec[2]*texvec[2]);
+ if(texres->tin<0.0) texres->tin= 0.0;
+ if(tex->stype==5) texres->tin*= texres->tin; /* halo */
}
- BRICON;
+ BRICONT;
return 0;
}
@@ -273,33 +321,34 @@ static int blend(Tex *tex, float *texvec)
/* newnoise: all noisebased types now have different noisebases to choose from */
-static int clouds(Tex *tex, float *texvec)
+static int clouds(Tex *tex, float *texvec, TexResult *texres)
{
int rv=0; /* return value, int:0, col:1, nor:2, everything:3 */
- Tin = BLI_gTurbulence(tex->noisesize, texvec[0], texvec[1], texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+
+ texres->tin = BLI_gTurbulence(tex->noisesize, texvec[0], texvec[1], texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- if (tex->nor!=NULL) {
+ if (texres->nor!=NULL) {
// calculate bumpnormal
- tex->nor[0] = BLI_gTurbulence(tex->noisesize, texvec[0] + tex->nabla, texvec[1], texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- tex->nor[1] = BLI_gTurbulence(tex->noisesize, texvec[0], texvec[1] + tex->nabla, texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- tex->nor[2] = BLI_gTurbulence(tex->noisesize, texvec[0], texvec[1], texvec[2] + tex->nabla, tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+ texres->nor[0] = BLI_gTurbulence(tex->noisesize, texvec[0] + tex->nabla, texvec[1], texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+ texres->nor[1] = BLI_gTurbulence(tex->noisesize, texvec[0], texvec[1] + tex->nabla, texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+ texres->nor[2] = BLI_gTurbulence(tex->noisesize, texvec[0], texvec[1], texvec[2] + tex->nabla, tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- tex_normal_derivate(Tin, tex);
+ tex_normal_derivate(tex, texres);
rv += 2;
}
if (tex->stype==1) {
// in this case, int. value should really be computed from color,
// and bumpnormal from that, would be too slow, looks ok as is
- Tr = Tin;
- Tg = BLI_gTurbulence(tex->noisesize, texvec[1], texvec[0], texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- Tb = BLI_gTurbulence(tex->noisesize, texvec[1], texvec[2], texvec[0], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- BRICONRGB;
- Ta = 1.0;
+ texres->tr = texres->tin;
+ texres->tg = BLI_gTurbulence(tex->noisesize, texvec[1], texvec[0], texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+ texres->tb = BLI_gTurbulence(tex->noisesize, texvec[1], texvec[2], texvec[0], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+ BRICONTRGB;
+ texres->ta = 1.0;
return (rv+1);
}
- BRICON;
+ BRICONT;
return rv;
@@ -326,22 +375,22 @@ static float wood_int(Tex *tex, float x, float y, float z)
return wi;
}
-static int wood(Tex *tex, float *texvec)
+static int wood(Tex *tex, float *texvec, TexResult *texres)
{
int rv=0; /* return value, int:0, col:1, nor:2, everything:3 */
- Tin = wood_int(tex, texvec[0], texvec[1], texvec[2]);
- if (tex->nor!=NULL) {
+ texres->tin = wood_int(tex, texvec[0], texvec[1], texvec[2]);
+ if (texres->nor!=NULL) {
/* calculate bumpnormal */
- tex->nor[0] = wood_int(tex, texvec[0] + tex->nabla, texvec[1], texvec[2]);
- tex->nor[1] = wood_int(tex, texvec[0], texvec[1] + tex->nabla, texvec[2]);
- tex->nor[2] = wood_int(tex, texvec[0], texvec[1], texvec[2] + tex->nabla);
+ texres->nor[0] = wood_int(tex, texvec[0] + tex->nabla, texvec[1], texvec[2]);
+ texres->nor[1] = wood_int(tex, texvec[0], texvec[1] + tex->nabla, texvec[2]);
+ texres->nor[2] = wood_int(tex, texvec[0], texvec[1], texvec[2] + tex->nabla);
- tex_normal_derivate(Tin, tex);
+ tex_normal_derivate(tex, texres);
rv += 2;
}
- BRICON;
+ BRICONT;
return rv;
}
@@ -362,31 +411,31 @@ static float marble_int(Tex *tex, float x, float y, float z)
return mi;
}
-static int marble(Tex *tex, float *texvec)
+static int marble(Tex *tex, float *texvec, TexResult *texres)
{
int rv=0; /* return value, int:0, col:1, nor:2, everything:3 */
- Tin = marble_int(tex, texvec[0], texvec[1], texvec[2]);
+ texres->tin = marble_int(tex, texvec[0], texvec[1], texvec[2]);
- if (tex->nor!=NULL) {
+ if (texres->nor!=NULL) {
/* calculate bumpnormal */
- tex->nor[0] = marble_int(tex, texvec[0] + tex->nabla, texvec[1], texvec[2]);
- tex->nor[1] = marble_int(tex, texvec[0], texvec[1] + tex->nabla, texvec[2]);
- tex->nor[2] = marble_int(tex, texvec[0], texvec[1], texvec[2] + tex->nabla);
+ texres->nor[0] = marble_int(tex, texvec[0] + tex->nabla, texvec[1], texvec[2]);
+ texres->nor[1] = marble_int(tex, texvec[0], texvec[1] + tex->nabla, texvec[2]);
+ texres->nor[2] = marble_int(tex, texvec[0], texvec[1], texvec[2] + tex->nabla);
- tex_normal_derivate(Tin, tex);
+ tex_normal_derivate(tex, texres);
rv += 2;
}
- BRICON;
+ BRICONT;
return rv;
}
/* ------------------------------------------------------------------------- */
-static int magic(Tex *tex, float *texvec)
+static int magic(Tex *tex, float *texvec, TexResult *texres)
{
float x, y, z, turb=1.0;
int n;
@@ -447,14 +496,14 @@ static int magic(Tex *tex, float *texvec)
y/= turb;
z/= turb;
}
- Tr= 0.5-x;
- Tg= 0.5-y;
- Tb= 0.5-z;
+ texres->tr= 0.5-x;
+ texres->tg= 0.5-y;
+ texres->tb= 0.5-z;
- Tin= 0.3333*(Tr+Tg+Tb);
+ texres->tin= 0.3333*(texres->tr+texres->tg+texres->tb);
- BRICONRGB;
- Ta= 1.0;
+ BRICONTRGB;
+ texres->ta= 1.0;
return 1;
}
@@ -462,26 +511,26 @@ static int magic(Tex *tex, float *texvec)
/* ------------------------------------------------------------------------- */
/* newnoise: stucci also modified to use different noisebasis */
-static int stucci(Tex *tex, float *texvec)
+static int stucci(Tex *tex, float *texvec, TexResult *texres)
{
float b2, ofs;
- if(tex->nor == NULL) return 0;
+ if(texres->nor == NULL) return 0;
ofs= tex->turbul/200.0;
- Tin=b2= BLI_gNoise(tex->noisesize, texvec[0], texvec[1], texvec[2], (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+ texres->tin=b2= BLI_gNoise(tex->noisesize, texvec[0], texvec[1], texvec[2], (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
if(tex->stype) ofs*=(b2*b2);
- tex->nor[0] = BLI_gNoise(tex->noisesize, texvec[0]+ofs, texvec[1], texvec[2], (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- tex->nor[1] = BLI_gNoise(tex->noisesize, texvec[0], texvec[1]+ofs, texvec[2], (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- tex->nor[2] = BLI_gNoise(tex->noisesize, texvec[0], texvec[1], texvec[2]+ofs, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+ texres->nor[0] = BLI_gNoise(tex->noisesize, texvec[0]+ofs, texvec[1], texvec[2], (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+ texres->nor[1] = BLI_gNoise(tex->noisesize, texvec[0], texvec[1]+ofs, texvec[2], (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
+ texres->nor[2] = BLI_gNoise(tex->noisesize, texvec[0], texvec[1], texvec[2]+ofs, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- tex_normal_derivate(b2, tex);
+ tex_normal_derivate(tex, texres);
if(tex->stype==2) {
- tex->nor[0]= -tex->nor[0];
- tex->nor[1]= -tex->nor[1];
- tex->nor[2]= -tex->nor[2];
+ texres->nor[0]= -texres->nor[0];
+ texres->nor[1]= -texres->nor[1];
+ texres->nor[2]= -texres->nor[2];
}
return 2;
@@ -490,7 +539,7 @@ static int stucci(Tex *tex, float *texvec)
/* ------------------------------------------------------------------------- */
/* newnoise: musgrave terrain noise types */
-static float mg_mFractalOrfBmTex(Tex *tex, float *texvec)
+static float mg_mFractalOrfBmTex(Tex *tex, float *texvec, TexResult *texres)
{
int rv=0; /* return value, int:0, col:1, nor:2, everything:3 */
float (*mgravefunc)(float, float, float, float, float, float, int);
@@ -500,27 +549,27 @@ static float mg_mFractalOrfBmTex(Tex *tex, float *texvec)
else
mgravefunc = mg_fBm;
- Tin = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
+ texres->tin = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
- if (tex->nor!=NULL) {
+ if (texres->nor!=NULL) {
float offs= tex->nabla/tex->noisesize; // also scaling of texvec
/* calculate bumpnormal */
- tex->nor[0] = tex->ns_outscale*mgravefunc(texvec[0] + offs, texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
- tex->nor[1] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1] + offs, texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
- tex->nor[2] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2] + offs, tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
+ texres->nor[0] = tex->ns_outscale*mgravefunc(texvec[0] + offs, texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
+ texres->nor[1] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1] + offs, texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
+ texres->nor[2] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2] + offs, tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
- tex_normal_derivate(Tin, tex);
+ tex_normal_derivate(tex, texres);
rv += 2;
}
- BRICON;
+ BRICONT;
return rv;
}
-static float mg_ridgedOrHybridMFTex(Tex *tex, float *texvec)
+static float mg_ridgedOrHybridMFTex(Tex *tex, float *texvec, TexResult *texres)
{
int rv=0; /* return value, int:0, col:1, nor:2, everything:3 */
float (*mgravefunc)(float, float, float, float, float, float, float, float, int);
@@ -530,71 +579,71 @@ static float mg_ridgedOrHybridMFTex(Tex *tex, float *texvec)
else
mgravefunc = mg_HybridMultiFractal;
- Tin = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
+ texres->tin = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
- if (tex->nor!=NULL) {
+ if (texres->nor!=NULL) {
float offs= tex->nabla/tex->noisesize; // also scaling of texvec
/* calculate bumpnormal */
- tex->nor[0] = tex->ns_outscale*mgravefunc(texvec[0] + offs, texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
- tex->nor[1] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1] + offs, texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
- tex->nor[2] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2] + offs, tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
+ texres->nor[0] = tex->ns_outscale*mgravefunc(texvec[0] + offs, texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
+ texres->nor[1] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1] + offs, texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
+ texres->nor[2] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2] + offs, tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
- tex_normal_derivate(Tin, tex);
+ tex_normal_derivate(tex, texres);
rv += 2;
}
- BRICON;
+ BRICONT;
return rv;
}
-static float mg_HTerrainTex(Tex *tex, float *texvec)
+static float mg_HTerrainTex(Tex *tex, float *texvec, TexResult *texres)
{
int rv=0; /* return value, int:0, col:1, nor:2, everything:3 */
- Tin = tex->ns_outscale*mg_HeteroTerrain(texvec[0], texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
+ texres->tin = tex->ns_outscale*mg_HeteroTerrain(texvec[0], texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
- if (tex->nor!=NULL) {
+ if (texres->nor!=NULL) {
float offs= tex->nabla/tex->noisesize; // also scaling of texvec
/* calculate bumpnormal */
- tex->nor[0] = tex->ns_outscale*mg_HeteroTerrain(texvec[0] + offs, texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
- tex->nor[1] = tex->ns_outscale*mg_HeteroTerrain(texvec[0], texvec[1] + offs, texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
- tex->nor[2] = tex->ns_outscale*mg_HeteroTerrain(texvec[0], texvec[1], texvec[2] + offs, tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
+ texres->nor[0] = tex->ns_outscale*mg_HeteroTerrain(texvec[0] + offs, texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
+ texres->nor[1] = tex->ns_outscale*mg_HeteroTerrain(texvec[0], texvec[1] + offs, texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
+ texres->nor[2] = tex->ns_outscale*mg_HeteroTerrain(texvec[0], texvec[1], texvec[2] + offs, tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
- tex_normal_derivate(Tin, tex);
+ tex_normal_derivate(tex, texres);
rv += 2;
}
- BRICON;
+ BRICONT;
return rv;
}
-static float mg_distNoiseTex(Tex *tex, float *texvec)
+static float mg_distNoiseTex(Tex *tex, float *texvec, TexResult *texres)
{
int rv=0; /* return value, int:0, col:1, nor:2, everything:3 */
- Tin = mg_VLNoise(texvec[0], texvec[1], texvec[2], tex->dist_amount, tex->noisebasis, tex->noisebasis2);
+ texres->tin = mg_VLNoise(texvec[0], texvec[1], texvec[2], tex->dist_amount, tex->noisebasis, tex->noisebasis2);
- if (tex->nor!=NULL) {
+ if (texres->nor!=NULL) {
float offs= tex->nabla/tex->noisesize; // also scaling of texvec
/* calculate bumpnormal */
- tex->nor[0] = mg_VLNoise(texvec[0] + offs, texvec[1], texvec[2], tex->dist_amount, tex->noisebasis, tex->noisebasis2);
- tex->nor[1] = mg_VLNoise(texvec[0], texvec[1] + offs, texvec[2], tex->dist_amount, tex->noisebasis, tex->noisebasis2);
- tex->nor[2] = mg_VLNoise(texvec[0], texvec[1], texvec[2] + offs, tex->dist_amount, tex->noisebasis, tex->noisebasis2);
+ texres->nor[0] = mg_VLNoise(texvec[0] + offs, texvec[1], texvec[2], tex->dist_amount, tex->noisebasis, tex->noisebasis2);
+ texres->nor[1] = mg_VLNoise(texvec[0], texvec[1] + offs, texvec[2], tex->dist_amount, tex->noisebasis, tex->noisebasis2);
+ texres->nor[2] = mg_VLNoise(texvec[0], texvec[1], texvec[2] + offs, tex->dist_amount, tex->noisebasis, tex->noisebasis2);
- tex_normal_derivate(Tin, tex);
+ tex_normal_derivate(tex, texres);
rv += 2;
}
- BRICON;
+ BRICONT;
return rv;
@@ -605,7 +654,7 @@ static float mg_distNoiseTex(Tex *tex, float *texvec)
/* ------------------------------------------------------------------------- */
/* newnoise: Voronoi texture type, probably the slowest, especially with minkovsky, bumpmapping, could be done another way */
-static float voronoiTex(Tex *tex, float *texvec)
+static float voronoiTex(Tex *tex, float *texvec, TexResult *texres)
{
int rv=0; /* return value, int:0, col:1, nor:2, everything:3 */
float da[4], pa[12]; /* distance and point coordinate arrays of 4 nearest neighbours */
@@ -617,63 +666,63 @@ static float voronoiTex(Tex *tex, float *texvec)
if (sc!=0.f) sc = tex->ns_outscale/sc;
voronoi(texvec[0], texvec[1], texvec[2], da, pa, tex->vn_mexp, tex->vn_distm);
- Tin = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
+ texres->tin = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
if (tex->vn_coltype) {
float ca[3]; /* cell color */
cellNoiseV(pa[0], pa[1], pa[2], ca);
- Tr = aw1*ca[0];
- Tg = aw1*ca[1];
- Tb = aw1*ca[2];
+ texres->tr = aw1*ca[0];
+ texres->tg = aw1*ca[1];
+ texres->tb = aw1*ca[2];
cellNoiseV(pa[3], pa[4], pa[5], ca);
- Tr += aw2*ca[0];
- Tg += aw2*ca[1];
- Tb += aw2*ca[2];
+ texres->tr += aw2*ca[0];
+ texres->tg += aw2*ca[1];
+ texres->tb += aw2*ca[2];
cellNoiseV(pa[6], pa[7], pa[8], ca);
- Tr += aw3*ca[0];
- Tg += aw3*ca[1];
- Tb += aw3*ca[2];
+ texres->tr += aw3*ca[0];
+ texres->tg += aw3*ca[1];
+ texres->tb += aw3*ca[2];
cellNoiseV(pa[9], pa[10], pa[11], ca);
- Tr += aw4*ca[0];
- Tg += aw4*ca[1];
- Tb += aw4*ca[2];
+ texres->tr += aw4*ca[0];
+ texres->tg += aw4*ca[1];
+ texres->tb += aw4*ca[2];
if (tex->vn_coltype>=2) {
float t1 = (da[1]-da[0])*10;
if (t1>1) t1=1;
- if (tex->vn_coltype==3) t1*=Tin; else t1*=sc;
- Tr *= t1;
- Tg *= t1;
- Tb *= t1;
+ if (tex->vn_coltype==3) t1*=texres->tin; else t1*=sc;
+ texres->tr *= t1;
+ texres->tg *= t1;
+ texres->tb *= t1;
}
else {
- Tr *= sc;
- Tg *= sc;
- Tb *= sc;
+ texres->tr *= sc;
+ texres->tg *= sc;
+ texres->tb *= sc;
}
}
- if (tex->nor!=NULL) {
+ if (texres->nor!=NULL) {
float offs= tex->nabla/tex->noisesize; // also scaling of texvec
/* calculate bumpnormal */
voronoi(texvec[0] + offs, texvec[1], texvec[2], da, pa, tex->vn_mexp, tex->vn_distm);
- tex->nor[0] = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
+ texres->nor[0] = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
voronoi(texvec[0], texvec[1] + offs, texvec[2], da, pa, tex->vn_mexp, tex->vn_distm);
- tex->nor[1] = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
+ texres->nor[1] = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
voronoi(texvec[0], texvec[1], texvec[2] + offs, da, pa, tex->vn_mexp, tex->vn_distm);
- tex->nor[2] = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
+ texres->nor[2] = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
- tex_normal_derivate(Tin, tex);
+ tex_normal_derivate(tex, texres);
rv += 2;
}
if (tex->vn_coltype) {
- BRICONRGB;
- Ta = 1.0;
+ BRICONTRGB;
+ texres->ta = 1.0;
return (rv+1);
}
- BRICON;
+ BRICONT;
return rv;
@@ -682,7 +731,7 @@ static float voronoiTex(Tex *tex, float *texvec)
/* ------------------------------------------------------------------------- */
-static int texnoise(Tex *tex)
+static int texnoise(Tex *tex, TexResult *texres)
{
float div=3.0;
int val, ran, loop;
@@ -697,84 +746,52 @@ static int texnoise(Tex *tex)
div*= 3.0;
}
- Tin= ((float)val)/div;;
+ texres->tin= ((float)val)/div;;
- BRICON;
+ BRICONT;
return 0;
}
/* ------------------------------------------------------------------------- */
-static int plugintex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex)
+static int plugintex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexResult *texres)
{
PluginTex *pit;
int rgbnor=0;
- Tin= 0.0;
+ texres->tin= 0.0;
pit= tex->plugin;
if(pit && pit->doit) {
- if(tex->nor) {
- VECCOPY(pit->result+5, tex->nor);
+ if(texres->nor) {
+ VECCOPY(pit->result+5, texres->nor);
}
if(osatex) rgbnor= ((TexDoit)pit->doit)(tex->stype, pit->data, texvec, dxt, dyt);
else rgbnor= ((TexDoit)pit->doit)(tex->stype, pit->data, texvec, 0, 0);
- Tin= pit->result[0];
+ texres->tin= pit->result[0];
if(rgbnor & TEX_NOR) {
- if(tex->nor) {
- VECCOPY(tex->nor, pit->result+5);
+ if(texres->nor) {
+ VECCOPY(texres->nor, pit->result+5);
}
}
if(rgbnor & TEX_RGB) {
- Tr= pit->result[1];
- Tg= pit->result[2];
- Tb= pit->result[3];
- Ta= pit->result[4];
+ texres->tr= pit->result[1];
+ texres->tg= pit->result[2];
+ texres->tb= pit->result[3];
+ texres->ta= pit->result[4];
- BRICONRGB;
+ BRICONTRGB;
}
- BRICON;
+ BRICONT;
}
return rgbnor;
}
-/* *************** PROJECTIONS ******************* */
-
-void tubemap(float x, float y, float z, float *adr1, float *adr2)
-{
- float len;
-
- *adr2 = (z + 1.0) / 2.0;
-
- len= sqrt(x*x+y*y);
- if(len>0) {
- *adr1 = (1.0 - (atan2(x/len,y/len) / M_PI)) / 2.0;
- }
-}
-
-/* ------------------------------------------------------------------------- */
-
-void spheremap(float x, float y, float z, float *adr1, float *adr2)
-{
- float len;
-
- len= sqrt(x*x+y*y+z*z);
- if(len>0.0) {
-
- if(x==0.0 && y==0.0) *adr1= 0.0; /* othwise domain error */
- else *adr1 = (1.0 - atan2(x,y)/M_PI )/2.0;
-
- z/=len;
- *adr2 = 1.0- saacos(z)/M_PI;
- }
-}
-
-/* ------------------------------------------------------------------------- */
static int cubemap_glob(MTex *mtex, VlakRen *vlr, float x, float y, float z, float *adr1, float *adr2)
{
@@ -1065,98 +1082,123 @@ static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *dxt, float
/* ************************************** */
-int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex)
+static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexResult *texres)
{
int retval=0; /* return value, int:0, col:1, nor:2, everything:3 */
- Talpha= 0; /* is set when image texture returns alpha (considered premul) */
+ texres->talpha= 0; /* is set when image texture returns alpha (considered premul) */
switch(tex->type) {
case 0:
- Tin= 0.0;
+ texres->tin= 0.0;
return 0;
case TEX_CLOUDS:
- retval= clouds(tex, texvec);
+ retval= clouds(tex, texvec, texres);
break;
case TEX_WOOD:
- retval= wood(tex, texvec);
+ retval= wood(tex, texvec, texres);
break;
case TEX_MARBLE:
- retval= marble(tex, texvec);
+ retval= marble(tex, texvec, texres);
break;
case TEX_MAGIC:
- retval= magic(tex, texvec);
+ retval= magic(tex, texvec, texres);
break;
case TEX_BLEND:
- retval= blend(tex, texvec);
+ retval= blend(tex, texvec, texres);
break;
case TEX_STUCCI:
- retval= stucci(tex, texvec);
+ retval= stucci(tex, texvec, texres);
if (tex->flag & TEX_COLORBAND);
- else Tin= 0.0; // stucci doesnt return Tin, for backwards compat...
+ else texres->tin= 0.0; // stucci doesnt return Tin, for backwards compat...
break;
case TEX_NOISE:
- retval= texnoise(tex);
+ retval= texnoise(tex, texres);
break;
case TEX_IMAGE:
- if(osatex) retval= imagewraposa(tex, texvec, dxt, dyt);
- else retval= imagewrap(tex, texvec);
+ if(osatex) retval= imagewraposa(tex, texvec, dxt, dyt, texres);
+ else retval= imagewrap(tex, texvec, texres);
break;
case TEX_PLUGIN:
- retval= plugintex(tex, texvec, dxt, dyt, osatex);
+ retval= plugintex(tex, texvec, dxt, dyt, osatex, texres);
break;
case TEX_ENVMAP:
- retval= envmaptex(tex, texvec, dxt, dyt, osatex);
+ retval= envmaptex(tex, texvec, dxt, dyt, osatex, texres);
break;
case TEX_MUSGRAVE:
/* newnoise: musgrave types */
- /* ton: added this, for Blender convention reason. scaling texvec here is so-so... */
+ /* ton: added this, for Blender convention reason. scaling texvec here is so-so ... */
VecMulf(texvec, 1.0/tex->noisesize);
switch(tex->stype) {
case TEX_MFRACTAL:
case TEX_FBM:
- retval= mg_mFractalOrfBmTex(tex, texvec);
+ retval= mg_mFractalOrfBmTex(tex, texvec, texres);
break;
case TEX_RIDGEDMF:
case TEX_HYBRIDMF:
- retval= mg_ridgedOrHybridMFTex(tex, texvec);
+ retval= mg_ridgedOrHybridMFTex(tex, texvec, texres);
break;
case TEX_HTERRAIN:
- retval= mg_HTerrainTex(tex, texvec);
+ retval= mg_HTerrainTex(tex, texvec, texres);
break;
}
break;
/* newnoise: voronoi type */
case TEX_VORONOI:
- /* ton: added this, for Blender convention reason. scaling texvec here is so-so... */
+ /* ton: added this, for Blender convention reason. scaling texvec here is so-so ... */
VecMulf(texvec, 1.0/tex->noisesize);
- retval= voronoiTex(tex, texvec);
+ retval= voronoiTex(tex, texvec, texres);
break;
case TEX_DISTNOISE:
- /* ton: added this, for Blender convention reason. scaling texvec here is so-so... */
+ /* ton: added this, for Blender convention reason. scaling texvec here is so-so ... */
VecMulf(texvec, 1.0/tex->noisesize);
- retval= mg_distNoiseTex(tex, texvec);
+ retval= mg_distNoiseTex(tex, texvec, texres);
break;
}
if (tex->flag & TEX_COLORBAND) {
float col[4];
- if (do_colorband(tex->coba, Tin, col)) {
+ if (do_colorband(tex->coba, texres->tin, col)) {
+ texres->talpha= 1;
+ texres->tr= col[0];
+ texres->tg= col[1];
+ texres->tb= col[2];
+ texres->ta= col[3];
retval |= 1;
- Tr= col[0];
- Tg= col[1];
- Tb= col[2];
- Ta= col[3];
}
}
return retval;
}
+int multitex_ext(Tex *tex, float *texvec, float *tin, float *tr, float *tg, float *tb, float *ta)
+{
+ TexResult texr;
+ float dummy[3];
+ int retval;
+
+ /* does not return Tin, hackish... */
+ if(tex->type==TEX_STUCCI) {
+ texr.nor= dummy;
+ dummy[0]= 1.0;
+ dummy[1]= dummy[2]= 0.0;
+ }
+ else texr.nor= NULL;
+
+ retval= multitex(tex, texvec, NULL, NULL, 0, &texr);
+ if(tex->type==TEX_STUCCI) *tin= texr.nor[0];
+ else *tin= texr.tin;
+ *tr= texr.tr;
+ *tg= texr.tg;
+ *tb= texr.tb;
+ *ta= texr.ta;
+ return retval;
+}
+
/* ------------------------------------------------------------------------- */
/* in = destination, tex = texture, out = previous color */
@@ -1304,10 +1346,9 @@ static float texture_value_blend(float tex, float out, float fact, float facg, i
void do_material_tex(ShadeInput *shi)
{
- Material *mat_col, *mat_colspec, *mat_colmir, *mat_ref, *mat_amb;
- Material *mat_spec, *mat_har, *mat_emit, *mat_alpha, *mat_ray_mirr, *mat_translu;
MTex *mtex;
Tex *tex;
+ TexResult texres;
float *co = NULL, *dx = NULL, *dy = NULL;
float fact, facm, factt, facmm, stencilTin=1.0;
float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3], Tnor=1.0;
@@ -1315,8 +1356,6 @@ void do_material_tex(ShadeInput *shi)
/* here: test flag if there's a tex (todo) */
- mat_col=mat_colspec=mat_colmir=mat_ref=mat_spec=mat_har=mat_emit=mat_alpha=mat_ray_mirr=mat_translu=mat_amb= shi->mat;
-
for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
/* separate tex switching */
@@ -1330,10 +1369,10 @@ void do_material_tex(ShadeInput *shi)
/* which coords */
if(mtex->texco==TEXCO_ORCO) {
- co= shi->lo; dx= O.dxlo; dy= O.dylo;
+ co= shi->lo; dx= shi->dxlo; dy= shi->dylo;
}
else if(mtex->texco==TEXCO_STICKY) {
- co= shi->sticky; dx= O.dxsticky; dy= O.dysticky;
+ co= shi->sticky; dx= shi->dxsticky; dy= shi->dysticky;
}
else if(mtex->texco==TEXCO_OBJECT) {
Object *ob= mtex->object;
@@ -1344,8 +1383,8 @@ void do_material_tex(ShadeInput *shi)
VECCOPY(tempvec, shi->co);
MTC_Mat4MulVecfl(ob->imat, tempvec);
if(shi->osatex) {
- VECCOPY(dxt, O.dxco);
- VECCOPY(dyt, O.dyco);
+ VECCOPY(dxt, shi->dxco);
+ VECCOPY(dyt, shi->dyco);
MTC_Mat4Mul3Vecfl(ob->imat, dxt);
MTC_Mat4Mul3Vecfl(ob->imat, dyt);
}
@@ -1353,32 +1392,32 @@ void do_material_tex(ShadeInput *shi)
else {
/* if object doesn't exist, do not use orcos (not initialized) */
co= shi->co;
- dx= O.dxco; dy= O.dyco;
+ dx= shi->dxco; dy= shi->dyco;
}
}
else if(mtex->texco==TEXCO_REFL) {
- co= shi->ref; dx= O.dxref; dy= O.dyref;
+ co= shi->ref; dx= shi->dxref; dy= shi->dyref;
}
else if(mtex->texco==TEXCO_NORM) {
- co= shi->orn; dx= O.dxno; dy= O.dyno;
+ co= shi->orn; dx= shi->dxno; dy= shi->dyno;
}
else if(mtex->texco==TEXCO_GLOB) {
- co= shi->gl; dx= O.dxco; dy= O.dyco;
+ co= shi->gl; dx= shi->dxco; dy= shi->dyco;
}
else if(mtex->texco==TEXCO_UV) {
- co= shi->uv; dx= O.dxuv; dy= O.dyuv;
+ co= shi->uv; dx= shi->dxuv; dy= shi->dyuv;
}
else if(mtex->texco==TEXCO_WINDOW) {
- co= shi->winco; dx= O.dxwin; dy= O.dywin;
+ co= shi->winco; dx= shi->dxwin; dy= shi->dywin;
}
else continue; // can happen when texco defines disappear and it renders old files
/* de pointer defines if bumping happens */
if(mtex->mapto & (MAP_NORM|MAP_DISPLACE|MAP_WARP)) {
- tex->nor= norvec;
+ texres.nor= norvec;
norvec[0]= norvec[1]= norvec[2]= 0.0;
}
- else tex->nor= NULL;
+ else texres.nor= NULL;
if(warpdone) {
VECADD(tempvec, co, warpvec);
@@ -1459,81 +1498,81 @@ void do_material_tex(ShadeInput *shi)
}
}
- rgbnor= multitex(tex, texvec, dxt, dyt, shi->osatex);
+ rgbnor= multitex(tex, texvec, dxt, dyt, shi->osatex, &texres);
/* texture output */
if( (rgbnor & TEX_RGB) && (mtex->texflag & MTEX_RGBTOINT)) {
- Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
- rgbnor-= 1;
+ texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
+ rgbnor-= TEX_RGB;
}
if(mtex->texflag & MTEX_NEGATIVE) {
if(rgbnor & TEX_RGB) {
- Tr= 1.0-Tr;
- Tg= 1.0-Tg;
- Tb= 1.0-Tb;
+ texres.tr= 1.0-texres.tr;
+ texres.tg= 1.0-texres.tg;
+ texres.tb= 1.0-texres.tb;
}
- Tin= 1.0-Tin;
+ texres.tin= 1.0-texres.tin;
}
if(mtex->texflag & MTEX_STENCIL) {
if(rgbnor & TEX_RGB) {
- fact= Ta;
- Ta*= stencilTin;
+ fact= texres.ta;
+ texres.ta*= stencilTin;
stencilTin*= fact;
}
else {
- fact= Tin;
- Tin*= stencilTin;
+ fact= texres.tin;
+ texres.tin*= stencilTin;
stencilTin*= fact;
}
}
else {
- Ta*= stencilTin;
+ texres.ta*= stencilTin;
Tnor*= stencilTin;
- Tin*= stencilTin;
+ texres.tin*= stencilTin;
}
- if(tex->nor) {
+ if(texres.nor) {
if((rgbnor & TEX_NOR)==0) {
/* make our own normal */
if(rgbnor & TEX_RGB) {
- tex->nor[0]= Tr;
- tex->nor[1]= Tg;
- tex->nor[2]= Tb;
+ texres.nor[0]= texres.tr;
+ texres.nor[1]= texres.tg;
+ texres.nor[2]= texres.tb;
}
else {
- float co= 0.5*cos(Tin-0.5);
- float si= 0.5*sin(Tin-0.5);
+ float co= 0.5*cos(texres.tin-0.5);
+ float si= 0.5*sin(texres.tin-0.5);
float f1, f2;
f1= shi->vn[0];
f2= shi->vn[1];
- tex->nor[0]= f1*co+f2*si;
- tex->nor[1]= f2*co-f1*si;
+ texres.nor[0]= f1*co+f2*si;
+ texres.nor[1]= f2*co-f1*si;
f1= shi->vn[1];
f2= shi->vn[2];
- tex->nor[1]= f1*co+f2*si;
- tex->nor[2]= f2*co-f1*si;
+ texres.nor[1]= f1*co+f2*si;
+ texres.nor[2]= f2*co-f1*si;
}
}
// warping, local space
if(mtex->mapto & MAP_WARP) {
- warpvec[0]= mtex->warpfac*tex->nor[0];
- warpvec[1]= mtex->warpfac*tex->nor[1];
- warpvec[2]= mtex->warpfac*tex->nor[2];
+ warpvec[0]= mtex->warpfac*texres.nor[0];
+ warpvec[1]= mtex->warpfac*texres.nor[1];
+ warpvec[2]= mtex->warpfac*texres.nor[2];
warpdone= 1;
}
// rotate to global coords
if(mtex->texco==TEXCO_ORCO || mtex->texco==TEXCO_UV) {
if(shi->vlr && shi->vlr->ob) {
- float len= Normalise(tex->nor);
+ float len= Normalise(texres.nor);
// can be optimized... (ton)
- Mat4Mul3Vecfl(shi->vlr->ob->obmat, tex->nor);
- Mat4Mul3Vecfl(R.viewmat, tex->nor);
- Normalise(tex->nor);
- VecMulf(tex->nor, len);
+ Mat4Mul3Vecfl(shi->vlr->ob->obmat, texres.nor);
+ Mat4Mul3Vecfl(R.viewmat, texres.nor);
+ Normalise(texres.nor);
+ VecMulf(texres.nor, len);
}
}
}
@@ -1543,7 +1582,7 @@ void do_material_tex(ShadeInput *shi)
if(mtex->mapto & (MAP_COL+MAP_COLSPEC+MAP_COLMIR)) {
float tcol[3];
- tcol[0]=Tr; tcol[1]=Tg; tcol[2]=Tb;
+ tcol[0]=texres.tr; tcol[1]=texres.tg; tcol[2]=texres.tb;
if((rgbnor & TEX_RGB)==0) {
tcol[0]= mtex->r;
@@ -1551,22 +1590,20 @@ void do_material_tex(ShadeInput *shi)
tcol[2]= mtex->b;
}
else if(mtex->mapto & MAP_ALPHA) {
- Tin= stencilTin;
+ texres.tin= stencilTin;
}
- else Tin= Ta;
+ else texres.tin= texres.ta;
if(mtex->mapto & MAP_COL) {
- texture_rgb_blend(&shi->matren->r, tcol, &mat_col->r, Tin, mtex->colfac, mtex->blendtype);
- mat_col= shi->matren;
+ texture_rgb_blend(&shi->r, tcol, &shi->r, texres.tin, mtex->colfac, mtex->blendtype);
}
if(mtex->mapto & MAP_COLSPEC) {
- texture_rgb_blend(&shi->matren->specr, tcol, &mat_colspec->specr, Tin, mtex->colfac, mtex->blendtype);
- mat_colspec= shi->matren;
+ texture_rgb_blend(&shi->specr, tcol, &shi->specr, texres.tin, mtex->colfac, mtex->blendtype);
}
if(mtex->mapto & MAP_COLMIR) {
// exception for envmap only
if(tex->type==TEX_ENVMAP && mtex->blendtype==MTEX_BLEND) {
- fact= Tin*mtex->colfac;
+ fact= texres.tin*mtex->colfac;
facm= 1.0- fact;
shi->refcol[0]= fact + facm*shi->refcol[0];
shi->refcol[1]= fact*tcol[0] + facm*shi->refcol[1];
@@ -1574,13 +1611,12 @@ void do_material_tex(ShadeInput *shi)
shi->refcol[3]= fact*tcol[2] + facm*shi->refcol[3];
}
else {
- texture_rgb_blend(&shi->matren->mirr, tcol, &mat_colmir->mirr, Tin, mtex->colfac, mtex->blendtype);
+ texture_rgb_blend(&shi->mirr, tcol, &shi->mirr, texres.tin, mtex->colfac, mtex->blendtype);
}
- mat_colmir= shi->matren;
}
}
if( (mtex->mapto & MAP_NORM) ) {
- if(tex->nor) {
+ if(texres.nor) {
if(mtex->maptoneg & MAP_NORM) tex->norfac= -mtex->norfac;
else tex->norfac= mtex->norfac;
@@ -1591,14 +1627,14 @@ void do_material_tex(ShadeInput *shi)
fact= Tnor*tex->norfac;
if(fact>1.0) fact= 1.0;
facm= 1.0- fact;
- shi->vn[0]= facm*shi->vn[0] + fact*tex->nor[0];
- shi->vn[1]= facm*shi->vn[1] + fact*tex->nor[1];
- shi->vn[2]= facm*shi->vn[2] + fact*tex->nor[2];
+ shi->vn[0]= facm*shi->vn[0] + fact*texres.nor[0];
+ shi->vn[1]= facm*shi->vn[1] + fact*texres.nor[1];
+ shi->vn[2]= facm*shi->vn[2] + fact*texres.nor[2];
}
else {
- shi->vn[0]+= Tnor*tex->norfac*tex->nor[0];
- shi->vn[1]+= Tnor*tex->norfac*tex->nor[1];
- shi->vn[2]+= Tnor*tex->norfac*tex->nor[2];
+ shi->vn[0]+= Tnor*tex->norfac*texres.nor[0];
+ shi->vn[1]+= Tnor*tex->norfac*texres.nor[1];
+ shi->vn[2]+= Tnor*tex->norfac*texres.nor[2];
}
Normalise(shi->vn);
@@ -1615,25 +1651,25 @@ void do_material_tex(ShadeInput *shi)
if( mtex->mapto & MAP_DISPLACE ) {
/* Now that most textures offer both Nor and Intensity, allow */
/* both to work, and let user select with slider. */
- if(tex->nor) {
+ if(texres.nor) {
if(mtex->maptoneg & MAP_DISPLACE) tex->norfac= -mtex->norfac;
else tex->norfac= mtex->norfac;
- shi->displace[0]+= 0.2f*Tnor*tex->norfac*tex->nor[0];
- shi->displace[1]+= 0.2f*Tnor*tex->norfac*tex->nor[1];
- shi->displace[2]+= 0.2f*Tnor*tex->norfac*tex->nor[2];
+ shi->displace[0]+= 0.2f*Tnor*tex->norfac*texres.nor[0];
+ shi->displace[1]+= 0.2f*Tnor*tex->norfac*texres.nor[1];
+ shi->displace[2]+= 0.2f*Tnor*tex->norfac*texres.nor[2];
}
if(rgbnor & TEX_RGB) {
- if(Talpha) Tin= Ta;
- else Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
+ if(texres.talpha) texres.tin= texres.ta;
+ else texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
}
if(mtex->maptoneg & MAP_DISPLACE) {
- factt= (0.5-Tin)*mtex->dispfac; facmm= 1.0-factt;
+ factt= (0.5-texres.tin)*mtex->dispfac; facmm= 1.0-factt;
}
else {
- factt= (Tin-0.5)*mtex->dispfac; facmm= 1.0-factt;
+ factt= (texres.tin-0.5)*mtex->dispfac; facmm= 1.0-factt;
}
if(mtex->blendtype==MTEX_BLEND) {
@@ -1657,81 +1693,66 @@ void do_material_tex(ShadeInput *shi)
if(mtex->mapto & MAP_VARS) {
if(rgbnor & TEX_RGB) {
- if(Talpha) Tin= Ta;
- else Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
+ if(texres.talpha) texres.tin= texres.ta;
+ else texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
}
if(mtex->mapto & MAP_REF) {
int flip= mtex->maptoneg & MAP_REF;
- shi->matren->ref= texture_value_blend(mtex->def_var, mat_ref->ref, Tin, mtex->varfac, mtex->blendtype, flip);
-
- if(shi->matren->ref<0.0) shi->matren->ref= 0.0;
- mat_ref= shi->matren;
+ shi->refl= texture_value_blend(mtex->def_var, shi->refl, texres.tin, mtex->varfac, mtex->blendtype, flip);
+ if(shi->refl<0.0) shi->refl= 0.0;
}
if(mtex->mapto & MAP_SPEC) {
int flip= mtex->maptoneg & MAP_SPEC;
- shi->matren->spec= texture_value_blend(mtex->def_var, mat_spec->spec, Tin, mtex->varfac, mtex->blendtype, flip);
-
- if(shi->matren->spec<0.0) shi->matren->spec= 0.0;
- mat_spec= shi->matren;
+ shi->spec= texture_value_blend(mtex->def_var, shi->spec, texres.tin, mtex->varfac, mtex->blendtype, flip);
+ if(shi->spec<0.0) shi->spec= 0.0;
}
if(mtex->mapto & MAP_EMIT) {
int flip= mtex->maptoneg & MAP_EMIT;
- shi->matren->emit= texture_value_blend(mtex->def_var, mat_emit->emit, Tin, mtex->varfac, mtex->blendtype, flip);
-
- if(shi->matren->emit<0.0) shi->matren->emit= 0.0;
- mat_emit= shi->matren;
+ shi->emit= texture_value_blend(mtex->def_var, shi->emit, texres.tin, mtex->varfac, mtex->blendtype, flip);
+ if(shi->emit<0.0) shi->emit= 0.0;
}
if(mtex->mapto & MAP_ALPHA) {
int flip= mtex->maptoneg & MAP_ALPHA;
- shi->matren->alpha= texture_value_blend(mtex->def_var, mat_alpha->alpha, Tin, mtex->varfac, mtex->blendtype, flip);
-
- if(shi->matren->alpha<0.0) shi->matren->alpha= 0.0;
- else if(shi->matren->alpha>1.0) shi->matren->alpha= 1.0;
- mat_alpha= shi->matren;
+ shi->alpha= texture_value_blend(mtex->def_var, shi->alpha, texres.tin, mtex->varfac, mtex->blendtype, flip);
+ if(shi->alpha<0.0) shi->alpha= 0.0;
+ else if(shi->alpha>1.0) shi->alpha= 1.0;
}
if(mtex->mapto & MAP_HAR) {
int flip= mtex->maptoneg & MAP_HAR;
float har; // have to map to 0-1
- har= ((float)mat_har->har)/128.0;
- har= 128.0*texture_value_blend(mtex->def_var, har, Tin, mtex->varfac, mtex->blendtype, flip);
+ har= ((float)shi->har)/128.0;
+ har= 128.0*texture_value_blend(mtex->def_var, har, texres.tin, mtex->varfac, mtex->blendtype, flip);
- if(har<1.0) shi->matren->har= 1;
- else if(har>511.0) shi->matren->har= 511;
- else shi->matren->har= (int)har;
- mat_har= shi->matren;
+ if(har<1.0) shi->har= 1;
+ else if(har>511.0) shi->har= 511;
+ else shi->har= (int)har;
}
if(mtex->mapto & MAP_RAYMIRR) {
int flip= mtex->maptoneg & MAP_RAYMIRR;
- shi->matren->ray_mirror= texture_value_blend(mtex->def_var, mat_ray_mirr->ray_mirror, Tin, mtex->varfac, mtex->blendtype, flip);
-
- if(shi->matren->ray_mirror<0.0) shi->matren->ray_mirror= 0.0;
- else if(shi->matren->ray_mirror>1.0) shi->matren->ray_mirror= 1.0;
- mat_ray_mirr= shi->matren;
+ shi->ray_mirror= texture_value_blend(mtex->def_var, shi->ray_mirror, texres.tin, mtex->varfac, mtex->blendtype, flip);
+ if(shi->ray_mirror<0.0) shi->ray_mirror= 0.0;
+ else if(shi->ray_mirror>1.0) shi->ray_mirror= 1.0;
}
if(mtex->mapto & MAP_TRANSLU) {
int flip= mtex->maptoneg & MAP_TRANSLU;
- shi->matren->translucency= texture_value_blend(mtex->def_var, mat_translu->translucency, Tin, mtex->varfac, mtex->blendtype, flip);
-
- if(shi->matren->translucency<0.0) shi->matren->translucency= 0.0;
- else if(shi->matren->translucency>1.0) shi->matren->translucency= 1.0;
- mat_translu= shi->matren;
+ shi->translucency= texture_value_blend(mtex->def_var, shi->translucency, texres.tin, mtex->varfac, mtex->blendtype, flip);
+ if(shi->translucency<0.0) shi->translucency= 0.0;
+ else if(shi->translucency>1.0) shi->translucency= 1.0;
}
if(mtex->mapto & MAP_AMB) {
int flip= mtex->maptoneg & MAP_AMB;
- shi->matren->amb= texture_value_blend(mtex->def_var, mat_amb->amb, Tin, mtex->varfac, mtex->blendtype, flip);
-
- if(shi->matren->amb<0.0) shi->matren->amb= 0.0;
- else if(shi->matren->amb>1.0) shi->matren->amb= 1.0;
- mat_amb= shi->matren;
+ shi->amb= texture_value_blend(mtex->def_var, shi->amb, texres.tin, mtex->varfac, mtex->blendtype, flip);
+ if(shi->amb<0.0) shi->amb= 0.0;
+ else if(shi->amb>1.0) shi->amb= 1.0;
}
}
}
@@ -1743,13 +1764,15 @@ void do_material_tex(ShadeInput *shi)
void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
{
MTex *mtex;
+ TexResult texres;
float texvec[3], dxt[3], dyt[3], fact, facm, dx;
int rgb, osatex;
mtex= har->mat->mtex[0];
- if(mtex->tex==0) return;
+ if(mtex->tex==NULL) return;
+
/* no normal mapping */
- mtex->tex->nor= NULL;
+ texres.nor= NULL;
texvec[0]= xn/har->rad;
texvec[1]= yn/har->rad;
@@ -1793,60 +1816,58 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
if(mtex->tex->type==TEX_IMAGE) do_2d_mapping(mtex, texvec, NULL, dxt, dyt);
- rgb= multitex(mtex->tex, texvec, dxt, dyt, osatex);
+ rgb= multitex(mtex->tex, texvec, dxt, dyt, osatex, &texres);
/* texture output */
if(rgb && (mtex->texflag & MTEX_RGBTOINT)) {
- Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
+ texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
rgb= 0;
}
if(mtex->texflag & MTEX_NEGATIVE) {
if(rgb) {
- Tr= 1.0-Tr;
- Tg= 1.0-Tg;
- Tb= 1.0-Tb;
+ texres.tr= 1.0-texres.tr;
+ texres.tg= 1.0-texres.tg;
+ texres.tb= 1.0-texres.tb;
}
- else Tin= 1.0-Tin;
+ else texres.tin= 1.0-texres.tin;
}
/* mapping */
if(mtex->mapto & MAP_COL) {
if(rgb==0) {
- Tr= mtex->r;
- Tg= mtex->g;
- Tb= mtex->b;
+ texres.tr= mtex->r;
+ texres.tg= mtex->g;
+ texres.tb= mtex->b;
}
else if(mtex->mapto & MAP_ALPHA) {
- Tin= 1.0;
+ texres.tin= 1.0;
}
- else Tin= Ta;
+ else texres.tin= texres.ta;
- fact= Tin*mtex->colfac;
+ fact= texres.tin*mtex->colfac;
facm= 1.0-fact;
if(mtex->blendtype==MTEX_MUL) {
facm= 1.0-mtex->colfac;
}
- else fact*= 256;
- /* note: halo colors are still 0-255, should map that for new mixing functions... */
if(mtex->blendtype==MTEX_SUB) fact= -fact;
if(mtex->blendtype==MTEX_BLEND) {
- colf[0]= (fact*Tr + facm*har->r);
- colf[1]= (fact*Tg + facm*har->g);
- colf[2]= (fact*Tb + facm*har->b);
+ colf[0]= (fact*texres.tr + facm*har->r);
+ colf[1]= (fact*texres.tg + facm*har->g);
+ colf[2]= (fact*texres.tb + facm*har->b);
}
else if(mtex->blendtype==MTEX_MUL) {
- colf[0]= (facm+fact*Tr)*har->r;
- colf[1]= (facm+fact*Tg)*har->g;
- colf[2]= (facm+fact*Tb)*har->b;
+ colf[0]= (facm+fact*texres.tr)*har->r;
+ colf[1]= (facm+fact*texres.tg)*har->g;
+ colf[2]= (facm+fact*texres.tb)*har->b;
}
else {
- colf[0]= (fact*Tr + har->r);
- colf[1]= (fact*Tg + har->g);
- colf[2]= (fact*Tb + har->b);
+ colf[0]= (fact*texres.tr + har->r);
+ colf[1]= (fact*texres.tg + har->g);
+ colf[2]= (fact*texres.tb + har->b);
CLAMP(colf[0], 0.0, 1.0);
CLAMP(colf[1], 0.0, 1.0);
@@ -1855,29 +1876,28 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
}
if(mtex->mapto & MAP_ALPHA) {
if(rgb) {
- if(Talpha) Tin= Ta;
- else Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
+ if(texres.talpha) texres.tin= texres.ta;
+ else texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
}
- colf[3]*= Tin;
+ colf[3]*= texres.tin;
}
}
/* ------------------------------------------------------------------------- */
-void do_sky_tex(float *lo)
+/* hor and zen are RGB vectors, blend is 1 float, should all be initialized */
+void do_sky_tex(float *lo, float *dxyview, float *hor, float *zen, float *blend)
{
- World *wrld_hor, *wrld_zen;
MTex *mtex;
+ TexResult texres;
float *co, fact, stencilTin=1.0;
float tempvec[3], texvec[3], dxt[3], dyt[3];
int tex_nr, rgb= 0, ok;
-
/* todo: add flag to test if there's a tex */
+ texres.nor= NULL;
- wrld_hor= wrld_zen= G.scene->world;
-
for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
if(R.wrld.mtex[tex_nr]) {
mtex= R.wrld.mtex[tex_nr];
@@ -1889,8 +1909,14 @@ void do_sky_tex(float *lo)
co= lo;
/* dxt dyt just from 1 value */
- dxt[0]= dxt[1]= dxt[2]= O.dxview;
- dyt[0]= dyt[1]= dyt[2]= O.dyview;
+ if(dxyview) {
+ dxt[0]= dxt[1]= dxt[2]= dxyview[0];
+ dyt[0]= dyt[1]= dyt[2]= dxyview[1];
+ }
+ else {
+ dxt[0]= dxt[1]= dxt[2]= 0.0;
+ dyt[0]= dyt[1]= dyt[2]= 0.0;
+ }
/* Grab the mapping settings for this texture */
switch(mtex->texco) {
@@ -1920,12 +1946,6 @@ void do_sky_tex(float *lo)
}
else {
/* potentially dangerous... check with multitex! */
- R.wrld.horr= (wrld_hor->horr);
- R.wrld.horg= (wrld_hor->horg);
- R.wrld.horb= (wrld_hor->horb);
- R.wrld.zenr= (wrld_hor->zenr);
- R.wrld.zeng= (wrld_hor->zeng);
- R.wrld.zenb= (wrld_hor->zenb);
continue;
}
break;
@@ -1950,36 +1970,36 @@ void do_sky_tex(float *lo)
/* texture */
if(mtex->tex->type==TEX_IMAGE) do_2d_mapping(mtex, texvec, NULL, dxt, dyt);
- rgb= multitex(mtex->tex, texvec, dxt, dyt, R.osa);
+ rgb= multitex(mtex->tex, texvec, dxt, dyt, R.osa, &texres);
/* texture output */
if(rgb && (mtex->texflag & MTEX_RGBTOINT)) {
- Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
+ texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
rgb= 0;
}
if(mtex->texflag & MTEX_NEGATIVE) {
if(rgb) {
- Tr= 1.0-Tr;
- Tg= 1.0-Tg;
- Tb= 1.0-Tb;
+ texres.tr= 1.0-texres.tr;
+ texres.tg= 1.0-texres.tg;
+ texres.tb= 1.0-texres.tb;
}
- else Tin= 1.0-Tin;
+ else texres.tin= 1.0-texres.tin;
}
if(mtex->texflag & MTEX_STENCIL) {
if(rgb) {
- fact= Ta;
- Ta*= stencilTin;
+ fact= texres.ta;
+ texres.ta*= stencilTin;
stencilTin*= fact;
}
else {
- fact= Tin;
- Tin*= stencilTin;
+ fact= texres.tin;
+ texres.tin*= stencilTin;
stencilTin*= fact;
}
}
else {
- if(rgb) Ta *= stencilTin;
- else Tin*= stencilTin;
+ if(rgb) texres.ta *= stencilTin;
+ else texres.tin*= stencilTin;
}
/* colour mapping */
@@ -1987,17 +2007,16 @@ void do_sky_tex(float *lo)
float tcol[3];
if(rgb==0) {
- Tr= mtex->r;
- Tg= mtex->g;
- Tb= mtex->b;
+ texres.tr= mtex->r;
+ texres.tg= mtex->g;
+ texres.tb= mtex->b;
}
- else Tin= Ta;
+ else texres.tin= texres.ta;
- tcol[0]= Tr; tcol[1]= Tg; tcol[2]= Tb;
+ tcol[0]= texres.tr; tcol[1]= texres.tg; tcol[2]= texres.tb;
if(mtex->mapto & WOMAP_HORIZ) {
- texture_rgb_blend(&R.wrld.horr, tcol, &wrld_hor->horr, Tin, mtex->colfac, mtex->blendtype);
- wrld_hor= &R.wrld;
+ texture_rgb_blend(hor, tcol, hor, texres.tin, mtex->colfac, mtex->blendtype);
}
if(mtex->mapto & (WOMAP_ZENUP+WOMAP_ZENDOWN)) {
ok= 0;
@@ -2010,41 +2029,32 @@ void do_sky_tex(float *lo)
else ok= 1;
if(ok) {
- texture_rgb_blend(&R.wrld.zenr, tcol, &wrld_hor->zenr, Tin, mtex->colfac, mtex->blendtype);
- wrld_zen= &R.wrld;
- }
- else {
- /* otherwise zenRGB undefined */
- R.wrld.zenr= wrld_zen->zenr;
- R.wrld.zeng= wrld_zen->zeng;
- R.wrld.zenb= wrld_zen->zenb;
+ texture_rgb_blend(zen, tcol, zen, texres.tin, mtex->colfac, mtex->blendtype);
}
}
}
if(mtex->mapto & WOMAP_BLEND) {
- if(rgb) Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
+ if(rgb) texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
- R.inprz= texture_value_blend(mtex->def_var, R.inprz, Tin, mtex->varfac, mtex->blendtype, 0);
+ *blend= texture_value_blend(mtex->def_var, *blend, texres.tin, mtex->varfac, mtex->blendtype, 0);
}
}
}
}
/* ------------------------------------------------------------------------- */
-/* explicit lampren stuff should be factored out! or rather, the
- texturing stuff might need to go...*/
-void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi)
+/* colf supposed to be initialized with la->r,g,b */
+
+void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf)
{
Object *ob;
- LampRen *la_col;
MTex *mtex;
Tex *tex;
+ TexResult texres;
float *co = NULL, *dx = NULL, *dy = NULL, fact, stencilTin=1.0;
float texvec[3], dxt[3], dyt[3], tempvec[3];
int tex_nr, rgb= 0;
- la_col= la->org;
-
tex_nr= 0;
for(; tex_nr<MAX_MTEX; tex_nr++) {
@@ -2053,8 +2063,8 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi)
mtex= la->mtex[tex_nr];
tex= mtex->tex;
- if(tex==0) continue;
- tex->nor= NULL;
+ if(tex==NULL) continue;
+ texres.nor= NULL;
/* which coords */
if(mtex->texco==TEXCO_OBJECT) {
@@ -2066,19 +2076,19 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi)
VECCOPY(tempvec, shi->co);
MTC_Mat4MulVecfl(ob->imat, tempvec);
if(shi->osatex) {
- VECCOPY(dxt, O.dxco);
- VECCOPY(dyt, O.dyco);
+ VECCOPY(dxt, shi->dxco);
+ VECCOPY(dyt, shi->dyco);
MTC_Mat4Mul3Vecfl(ob->imat, dxt);
MTC_Mat4Mul3Vecfl(ob->imat, dyt);
}
}
else {
co= shi->co;
- dx= O.dxco; dy= O.dyco;
+ dx= shi->dxco; dy= shi->dyco;
}
}
else if(mtex->texco==TEXCO_GLOB) {
- co= shi->gl; dx= O.dxco; dy= O.dyco;
+ co= shi->gl; dx= shi->dxco; dy= shi->dyco;
VECCOPY(shi->gl, shi->co);
MTC_Mat4MulVecfl(R.viewinv, shi->gl);
}
@@ -2095,8 +2105,8 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi)
dx= dxt; dy= dyt;
if(shi->osatex) {
- VECCOPY(dxt, O.dxlv);
- VECCOPY(dyt, O.dylv);
+ VECCOPY(dxt, shi->dxlv);
+ VECCOPY(dyt, shi->dylv);
/* need some matrix conversion here? la->imat is a [3][3] matrix!!! **/
MTC_Mat3MulVecfl(la->imat, dxt);
MTC_Mat3MulVecfl(la->imat, dyt);
@@ -2140,36 +2150,36 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi)
do_2d_mapping(mtex, texvec, NULL, dxt, dyt);
}
- rgb= multitex(tex, texvec, dxt, dyt, shi->osatex);
+ rgb= multitex(tex, texvec, dxt, dyt, shi->osatex, &texres);
/* texture output */
if(rgb && (mtex->texflag & MTEX_RGBTOINT)) {
- Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
+ texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
rgb= 0;
}
if(mtex->texflag & MTEX_NEGATIVE) {
if(rgb) {
- Tr= 1.0-Tr;
- Tg= 1.0-Tg;
- Tb= 1.0-Tb;
+ texres.tr= 1.0-texres.tr;
+ texres.tg= 1.0-texres.tg;
+ texres.tb= 1.0-texres.tb;
}
- else Tin= 1.0-Tin;
+ else texres.tin= 1.0-texres.tin;
}
if(mtex->texflag & MTEX_STENCIL) {
if(rgb) {
- fact= Ta;
- Ta*= stencilTin;
+ fact= texres.ta;
+ texres.ta*= stencilTin;
stencilTin*= fact;
}
else {
- fact= Tin;
- Tin*= stencilTin;
+ fact= texres.tin;
+ texres.tin*= stencilTin;
stencilTin*= fact;
}
}
else {
- if(rgb) Ta*= stencilTin;
- else Tin*= stencilTin;
+ if(rgb) texres.ta*= stencilTin;
+ else texres.tin*= stencilTin;
}
/* mapping */
@@ -2177,39 +2187,38 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi)
float col[3];
if(rgb==0) {
- Tr= mtex->r;
- Tg= mtex->g;
- Tb= mtex->b;
+ texres.tr= mtex->r;
+ texres.tg= mtex->g;
+ texres.tb= mtex->b;
}
else if(mtex->mapto & MAP_ALPHA) {
- Tin= stencilTin;
+ texres.tin= stencilTin;
}
- else Tin= Ta;
+ else texres.tin= texres.ta;
/* lamp colors were premultiplied with this */
- col[0]= Tr*la->energy;
- col[1]= Tg*la->energy;
- col[2]= Tb*la->energy;
+ col[0]= texres.tr*la->energy;
+ col[1]= texres.tg*la->energy;
+ col[2]= texres.tb*la->energy;
- texture_rgb_blend(&la->r, col, &la_col->r, Tin, mtex->colfac, mtex->blendtype);
-
- la_col= la; /* makes sure first run uses la->org, then la */
+ texture_rgb_blend(colf, col, colf, texres.tin, mtex->colfac, mtex->blendtype);
}
-
}
}
}
/* ------------------------------------------------------------------------- */
-void externtex(MTex *mtex, float *vec)
+void externtex(MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta)
{
Tex *tex;
- float dxt[3], dyt[3], texvec[3], dummy[3];
+ TexResult texr;
+ float dxt[3], dyt[3], texvec[3];
int rgb;
tex= mtex->tex;
- if(tex==0) return;
+ if(tex==NULL) return;
+ texr.nor= NULL;
/* placement */
if(mtex->projx) texvec[0]= mtex->size[0]*(vec[mtex->projx-1]+mtex->ofs[0]);
@@ -2224,85 +2233,68 @@ void externtex(MTex *mtex, float *vec)
/* texture */
if(tex->type==TEX_IMAGE) {
do_2d_mapping(mtex, texvec, NULL, dxt, dyt);
-
- if(mtex->mapto & MAP_NORM) {
- /* the pointer defines if there's bump */
- tex->nor= dummy;
- if(mtex->maptoneg & MAP_NORM) tex->norfac= -mtex->norfac;
- else tex->norfac= mtex->norfac;
- }
- else tex->nor= NULL;
}
- rgb= multitex(tex, texvec, dxt, dyt, 0);
+ rgb= multitex(tex, texvec, dxt, dyt, 0, &texr);
if(rgb) {
- Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
+ texr.tin= (0.35*texr.tr+0.45*texr.tg+0.2*texr.tb);
}
else {
- Tr= mtex->r;
- Tg= mtex->g;
- Tb= mtex->b;
+ texr.tr= mtex->r;
+ texr.tg= mtex->g;
+ texr.tb= mtex->b;
}
-}
-
-/* ------------------------------------------------------------------------- */
-
-void externtexcol(MTex *mtex, float *orco, char *col)
-{
- int temp;
- float b1;
-
- if(mtex->tex==0) return;
-
- externtex(mtex, orco);
-
- b1= 1.0-Tin;
-
- temp= 255*(Tin*Tr)+b1*col[0];
- if(temp>255) col[0]= 255; else col[0]= temp;
- temp= 255*(Tin*Tg)+b1*col[1];
- if(temp>255) col[1]= 255; else col[1]= temp;
- temp= 255*(Tin*Tb)+b1*col[2];
- if(temp>255) col[2]= 255; else col[2]= temp;
+ *tin= texr.tin;
+ *tr= texr.tr;
+ *tg= texr.tg;
+ *tb= texr.tb;
+ *ta= texr.ta;
}
+
/* ------------------------------------------------------------------------- */
void render_realtime_texture(ShadeInput *shi)
{
- static Tex tex;
+ TexResult texr;
+ static Tex tex1, tex2; // threadsafe
static int firsttime= 1;
+ Tex *tex;
float texvec[2], dx[2], dy[2];
if(firsttime) {
- default_tex(&tex);
- tex.type= TEX_IMAGE;
firsttime= 0;
+ default_tex(&tex1);
+ default_tex(&tex2);
+ tex1.type= TEX_IMAGE;
+ tex2.type= TEX_IMAGE;
}
- tex.ima = shi->vlr->tface->tpage;
- if(tex.ima) {
+ if(((int)(shi->ys+0.5)) & 1) tex= &tex1; else tex= &tex2; // threadsafe
+
+ tex->ima = shi->vlr->tface->tpage;
+ if(tex->ima) {
texvec[0]= 0.5+0.5*shi->uv[0];
texvec[1]= 0.5+0.5*shi->uv[1];
if(shi->osatex) {
- dx[0]= 0.5*O.dxuv[0];
- dx[1]= 0.5*O.dxuv[1];
- dy[0]= 0.5*O.dyuv[0];
- dy[1]= 0.5*O.dyuv[1];
+ dx[0]= 0.5*shi->dxuv[0];
+ dx[1]= 0.5*shi->dxuv[1];
+ dy[0]= 0.5*shi->dyuv[0];
+ dy[1]= 0.5*shi->dyuv[1];
}
- if(shi->osatex) imagewraposa(&tex, texvec, dx, dy);
- else imagewrap(&tex, texvec);
+ texr.nor= NULL;
+
+ if(shi->osatex) imagewraposa(tex, texvec, dx, dy, &texr);
+ else imagewrap(tex, texvec, &texr);
- shi->vcol[0]*= Tr;
- shi->vcol[1]*= Tg;
- shi->vcol[2]*= Tb;
+ shi->vcol[0]*= texr.tr;
+ shi->vcol[1]*= texr.tg;
+ shi->vcol[2]*= texr.tb;
}
-
-
}
/* eof */
diff --git a/source/blender/render/intern/source/vanillaRenderPipe.c b/source/blender/render/intern/source/vanillaRenderPipe.c
index 6745d58aacb..f76a7e479e2 100644
--- a/source/blender/render/intern/source/vanillaRenderPipe.c
+++ b/source/blender/render/intern/source/vanillaRenderPipe.c
@@ -56,13 +56,14 @@
#include "DNA_camera_types.h"
#include "DNA_object_types.h"
#include "BKE_global.h"
+#include "BKE_utildefines.h"
+#include "BLI_arithb.h"
#include "BLI_rand.h"
/* local includes (from the render module) */
#include "RE_callbacks.h"
#include "render.h" /* all kinds of stuff */
-#include "render_intern.h"
#include "zbuf.h" /* for vergzvlak, zbufclip, zbufclipwire */
#include "edgeRender.h" /* all edge rendering stuff */
#include "pixelshading.h" /* painting the pixels */
@@ -76,14 +77,11 @@
/* own includes */
#include "vanillaRenderPipe.h"
-#include "vanillaRenderPipe_int.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include "SDL_thread.h"
-/* crud */
-#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
+/* threshold for alpha */
+#define RE_FULL_ALPHA_FLOAT 0.9998
/* ------------------------------------------------------------------------- */
/* Debug defines: disable all for production level code. */
@@ -111,29 +109,20 @@ extern float Zjitx,Zjity; /* The x,y values for jitter offset */
extern float Zmulx, Zmuly; /* Some kind of scale? */
-extern unsigned int Zvlnr; /* Face rendering pointer and counter: these */
-extern VlakRen *Zvlr; /* are used for 'caching' render results. */
-
- /* These function pointers are used for z buffer filling. */
-extern void (*zbuffunc)(float *, float *, float *);
-extern void (*zbuflinefunc)(float *, float *);
-
extern char cmask[256]; /* When a pixel is supersampled, we must */
extern char *centmask; /* compute its colour on a point _on_ the face. */
/* These two are used to compute an offset to */
/* guarantee we use valid coordinates. */
-/* unsorted */
-extern float fmask[256];
-extern unsigned short usegamtab, shortcol[4],
- *mask1[9], *mask2[9],/* *igamtab1, */ *igamtab2/*, *gamtab */;
-
extern RE_APixstrExt *APixbufExt;/*Zbuffer: linked list of face, halo indices*/
/* Globals : --------------------------------------------------------------- */
- /* we use three lines, for gaussian sample */
+ /* we use 2 x three lines, for gaussian sample */
+RE_COLBUFTYPE *AColourBuffer0; /* Buffer for colours of 1 line of pixels */
RE_COLBUFTYPE *AColourBuffer1; /* Buffer for colours of 1 line of pixels */
RE_COLBUFTYPE *AColourBuffer2; /* Buffer for colours of 1 line of pixels */
+RE_COLBUFTYPE *AColourBuffer1a; /* Buffer for colours of 1 line of pixels */
+RE_COLBUFTYPE *AColourBuffer2a; /* Buffer for colours of 1 line of pixels */
RE_COLBUFTYPE *AColourBuffer3; /* Buffer for colours of 1 line of pixels */
static int Aminy; /* y value of first line in the accu buffer */
@@ -142,10 +131,6 @@ static int Amaxy; /* y value of last line in the accu buffer */
/* Buffer width refers to the size of the buffers we build. Image size is */
/* the same as R.rectx, R.recty. */
-static int imageHeight; /* image size in pixels in y direction */
-static int imageWidth; /* image size in pixels in x direction */
-static int bufferHeight; /* image size in pixels in y direction */
-static int bufferWidth; /* image size in pixels in x direction */
static int zBufferWidth; /* special width because zbuffer needs to be */
/* wider */
@@ -157,125 +142,24 @@ int alphaLUT[32]; /* alpha lookuptable, for oversampling */
int osaNr; /* The oversample number. I keep it */
/* separately here, because I treat no OSA */
/* as if it were osa=1. */
-RE_COLBUFTYPE collector[4]; /* used throughout as pixel colour accu */
-RE_COLBUFTYPE sampcol[RE_MAX_OSA_COUNT * 4]; /* subpixel accu buffer */
-
-/* ------------------------------------------------------------------------- */
-/* Local (for now) */
-/* void integrateStack(struct RE_faceField* stack, */
-/* int ptr, */
-/* float x, */
-/* float y, */
-/* int osaNr); */
-void integratePerSubStack(struct RE_faceField* stack,
- int ptr,
- float x,
- float y,
- int osaNr);
/* ------------------------------------------------------------------------- */
-void zBufShadeAdvanced()
-{
- RE_COLBUFTYPE *cycle;
- int y, keepLooping = 1;
- float xjit = 0.0, yjit = 0.0;
-
- Zjitx=Zjity= -0.5; /* jitter preset: -0.5 pixel */
-
- /* EDGE: for edge rendering we should compute a larger buffer, but this */
- /* may require modifications at a deeper level. For now, we just */
- /* 'ignore' edge pixels. */
- imageHeight = R.recty;
- imageWidth = R.rectx;
- bufferHeight = R.recty;
- bufferWidth = R.rectx;
-
- /* Set osaNr. Treat 'no osa' as 'osa = 1' */
- if(R.r.mode & R_OSA) {
- osaNr = R.osa;
- if(osaNr > 16) { /* check was moved from calcZBufLine */
- printf("zBufShadeAdvanced> osa too large (internal error)\n");
- G.afbreek= 1;
- return;
- }
- } else {
- /* little hack */
- osaNr = 1;
- xjit = jit[0][0];
- yjit = jit[0][1];
- jit[0][0] = 0.0;
- jit[0][1] = 0.0;
- }
-
- RE_setwindowclip(0, -1); /* just to be sure, reset the view matrix */
-
- initRenderBuffers(bufferWidth);
-
- /* ugh! should be converted sooner!! */
- switch (R.r.alphamode) {
- case R_ALPHAKEY:
- setSkyBlendingMode(RE_ALPHA_KEY);
- break;
- case R_ALPHAPREMUL:
- setSkyBlendingMode(RE_ALPHA_PREMUL);
- break;
-/* not there... this is the default case */
-/* case R_ALPHASKY: */
-/* setSkyBlendingMode(RE_ALPHA_SKY); */
-/* break; */
- default:
- setSkyBlendingMode(RE_ALPHA_SKY);
- }
-
- y = 0;
- while ( (y < bufferHeight) && keepLooping) {
- calcZBufLine(y);
-
- renderZBufLine(y);
- if(y) {
- transferColourBufferToOutput(y-1);
-
- if((y & 1)==0) RE_local_render_display(y-2, y-1, imageWidth, imageHeight, R.rectot);
- }
-
- /* buffer cycling */
- eraseColBuf(AColourBuffer3);
- cycle= AColourBuffer3;
- AColourBuffer3= AColourBuffer2;
- AColourBuffer2= AColourBuffer1;
- AColourBuffer1= cycle;
-
- if(RE_local_test_break()) keepLooping = 0;
- y++;
- }
- if(keepLooping) transferColourBufferToOutput(y-1);
-
- freeRenderBuffers();
-
- /* Edge rendering is done purely as a post-effect */
- if(R.r.mode & R_EDGE) {
- addEdges((char*)R.rectot, imageWidth, imageHeight,
- osaNr,
- R.r.edgeint, R.r.same_mat_redux,
- G.compat, G.notonlysolid,
- R.r.edgeR, R.r.edgeG, R.r.edgeB);
- }
-
- if (!(R.r.mode & R_OSA)) {
- jit[0][0] = xjit;
- jit[0][1] = yjit;
- }
-
-} /* end of void zbufshadeAdvanced() */
-
-/* ------------------------------------------------------------------------- */
-
-void initRenderBuffers(int bwidth)
+/**
+* Z buffer initializer, for new pipeline.
+ * <LI>
+ * <IT> AColourBuffer : colour buffer for one line
+ * <IT> APixbufExt : pixel data buffer for one line, depth RE_ZBUFLEN
+ * </LI>
+ */
+static void initRenderBuffers(int bwidth)
{
/* bwidth+4, as in rendercore.c. I think it's too much, but yah (ton) */
+ AColourBuffer0 = MEM_callocN(4 * sizeof(RE_COLBUFTYPE) * (bwidth+4), "Acolrow");
AColourBuffer1 = MEM_callocN(4 * sizeof(RE_COLBUFTYPE) * (bwidth+4), "Acolrow");
AColourBuffer2 = MEM_callocN(4 * sizeof(RE_COLBUFTYPE) * (bwidth+4), "Acolrow");
+ AColourBuffer1a = MEM_callocN(4 * sizeof(RE_COLBUFTYPE) * (bwidth+4), "Acolrow");
+ AColourBuffer2a = MEM_callocN(4 * sizeof(RE_COLBUFTYPE) * (bwidth+4), "Acolrow");
AColourBuffer3 = MEM_callocN(4 * sizeof(RE_COLBUFTYPE) * (bwidth+4), "Acolrow");
/* The +1 is needed because the fill-functions use a +1 offset when */
@@ -288,80 +172,353 @@ void initRenderBuffers(int bwidth)
Aminy= -1000; /* indices of lines in the z buffer: no lines buffered */
Amaxy= -1000;
- /* Use slider when the gamma button is pressed. */
- if (R.r.mode & R_GAMMA) {
- makeGammaTables(R.r.gamma);
- setDoGamma(1);
- } else {
- /*
- Needed for spotlights! Maybe a separate gammatable would be
- required here
- */
- makeGammaTables(1.0);
- setDoGamma(0);
- }
-} /* End of void initZBuffers(void) */
+}
/* ------------------------------------------------------------------------- */
+/**
+ * Z buffer destructor, frees stuff from initZBuffers().
+ */
-void freeRenderBuffers(void) {
+static void freeRenderBuffers(void) {
+ if (AColourBuffer0) MEM_freeN(AColourBuffer0);
if (AColourBuffer1) MEM_freeN(AColourBuffer1);
if (AColourBuffer2) MEM_freeN(AColourBuffer2);
+ if (AColourBuffer1a) MEM_freeN(AColourBuffer1a);
+ if (AColourBuffer2a) MEM_freeN(AColourBuffer2a);
if (AColourBuffer3) MEM_freeN(AColourBuffer3);
freeZbuffer();
-} /* End of void freeZBuffers(void) */
-
+}
/* ------------------------------------------------------------------------- */
-void calcZBufLine(int y)
+/**
+ * New fill function for z buffer, for edge-only rendering.
+ */
+static void zBufferFillFace(unsigned int zvlnr, float *v1, float *v2, float *v3)
{
+ /* Coordinates of the vertices are specified in ZCS */
+ int apteller, apoffsetteller;
+ double z0; /* used as temp var*/
+ double xx1;
+ double zxd,zyd,zy0, tmp;
+ float *minv,*maxv,*midv;
+ register int zverg,zvlak,x;
+ int my0,my2,sn1,sn2,rectx,zd;
+ int y,omsl,xs0,xs1,xs2,xs3, dx0,dx1,dx2, mask;
- int part;
- int keepLooping = 1;
+ /* These used to be doubles. We may want to change them back if the */
+ /* loss of accuracy proves to be a problem? There does not seem to be */
+ /* any performance issues here, so I'll just keep the doubles. */
+ /* float vec0[3], vec1[3], vec2[3]; */
+ double vec0[3], vec1[3], vec2[3];
- if(y<0) return;
+ /* MIN MAX */
+ /* sort vertices for min mid max y value */
+ if(v1[1]<v2[1]) {
+ if(v2[1]<v3[1]) { minv=v1; midv=v2; maxv=v3;}
+ else if(v1[1]<v3[1]) { minv=v1; midv=v3; maxv=v2;}
+ else { minv=v3; midv=v1; maxv=v2;}
+ }
+ else {
+ if(v1[1]<v3[1]) { minv=v2; midv=v1; maxv=v3;}
+ else if(v2[1]<v3[1]) { minv=v2; midv=v3; maxv=v1;}
+ else { minv=v3; midv=v2; maxv=v1;}
+ }
- /* zbuffer fix: here? */
- Zmulx= ((float) bufferWidth)/2.0;
- Zmuly= ((float) bufferHeight)/2.0;
+ if(minv[1] == maxv[1]) return; /* security to remove 'zero' size faces */
-
- /* use these buffer fill functions */
- zbuffunc = zBufferFillFace;
- zbuflinefunc = zBufferFillEdge;
-
- /* (FORALL y: Aminy =< y =< Amaxy: y is buffered) */
- if( (y < Aminy) || (y > Amaxy)) {
- /* prepare buffer */
- part = (y/RE_ZBUFLEN); /* These two lines are mystifying me... */
- Aminy = part * RE_ZBUFLEN; /* Possibly for rounding things? */
- Amaxy = Aminy + RE_ZBUFLEN - 1;
-/* if(Amaxy >= R.recty) Amaxy = R.recty-1; */
- if(Amaxy >= bufferHeight) Amaxy = bufferHeight - 1;
- resetZbuffer();
-
- Zsample = 0; /* Zsample is used internally ! */
- while ( (Zsample < osaNr) && keepLooping ) {
- /* Apply jitter to this pixel. The jitter offsets are globals. */
- /* They are added in zbufclip() */
- /* Negative: these offsets are added to the vertex coordinates */
- /* so it equals translating viewpoint over the positive vector. */
- Zjitx= -jit[Zsample][0]-0.5;
- Zjity= -jit[Zsample][1]-0.5;
+ my0 = ceil(minv[1]);
+ my2 = floor(maxv[1]);
+ omsl = floor(midv[1]);
- keepLooping = fillZBufDistances();
-
- if(RE_local_test_break()) keepLooping = 0;
- Zsample++;
- }
- };
-
-} /*End of void calcZBufLine(int y) */
+ /* outside the current z buffer slice: clip whole face */
+ if( (my2 < Aminy) || (my0 > Amaxy)) return;
+
+ if(my0<Aminy) my0= Aminy;
+
+ /* EDGES : THE LONGEST */
+ xx1= maxv[1]-minv[1];
+ if(xx1>2.0/65536.0) {
+ z0= (maxv[0]-minv[0])/xx1;
+
+ tmp= (-65536.0*z0);
+ dx0= CLAMPIS(tmp, INT_MIN, INT_MAX);
+
+ tmp= 65536.0*(z0*(my2-minv[1])+minv[0]);
+ xs0= CLAMPIS(tmp, INT_MIN, INT_MAX);
+ }
+ else {
+ dx0= 0;
+ xs0= 65536.0*(MIN2(minv[0],maxv[0]));
+ }
+ /* EDGES : THE TOP ONE */
+ xx1= maxv[1]-midv[1];
+ if(xx1>2.0/65536.0) {
+ z0= (maxv[0]-midv[0])/xx1;
+
+ tmp= (-65536.0*z0);
+ dx1= CLAMPIS(tmp, INT_MIN, INT_MAX);
+
+ tmp= 65536.0*(z0*(my2-midv[1])+midv[0]);
+ xs1= CLAMPIS(tmp, INT_MIN, INT_MAX);
+ }
+ else {
+ dx1= 0;
+ xs1= 65536.0*(MIN2(midv[0],maxv[0]));
+ }
+ /* EDGES : THE BOTTOM ONE */
+ xx1= midv[1]-minv[1];
+ if(xx1>2.0/65536.0) {
+ z0= (midv[0]-minv[0])/xx1;
+
+ tmp= (-65536.0*z0);
+ dx2= CLAMPIS(tmp, INT_MIN, INT_MAX);
+
+ tmp= 65536.0*(z0*(omsl-minv[1])+minv[0]);
+ xs2= CLAMPIS(tmp, INT_MIN, INT_MAX);
+ }
+ else {
+ dx2= 0;
+ xs2= 65536.0*(MIN2(minv[0],midv[0]));
+ }
+
+ /* ZBUF DX DY */
+ /* xyz_1 = v_1 - v_2 */
+ MTC_diff3DFF(vec1, v1, v2);
+ /* xyz_2 = v_2 - v_3 */
+ MTC_diff3DFF(vec2, v2, v3);
+ /* xyz_0 = xyz_1 cross xyz_2 */
+ MTC_cross3Double(vec0, vec1, vec2);
+
+ /* cross product of two of the sides is 0 => this face is too small */
+ if(vec0[2]==0.0) return;
+
+ if(midv[1] == maxv[1]) omsl= my2;
+ if(omsl < Aminy) omsl= Aminy-1; /* make sure it takes the first loop entirely */
+
+ while (my2 > Amaxy) { /* my2 can be larger */
+ xs0+=dx0;
+ if (my2<=omsl) {
+ xs2+= dx2;
+ }
+ else{
+ xs1+= dx1;
+ }
+ my2--;
+ }
+
+ xx1= (vec0[0]*v1[0]+vec0[1]*v1[1])/vec0[2]+v1[2];
+
+ zxd= -vec0[0]/vec0[2];
+ zyd= -vec0[1]/vec0[2];
+ zy0= my2*zyd+xx1;
+ zd= (int)CLAMPIS(zxd, INT_MIN, INT_MAX);
+
+ /* start-ofset in rect */
+ /* rectx= R.rectx; */
+ /* I suspect this var needs very careful setting... When edge rendering */
+ /* is on, this is strange */
+ rectx = zBufferWidth;
+ apoffsetteller = rectx*(my2-Aminy);
+
+ mask= 1<<Zsample;
+ zvlak= zvlnr;
+
+ xs3= 0; /* flag */
+ if(dx0>dx1) {
+ MTC_swapInt(&xs0, &xs1);
+ MTC_swapInt(&dx0, &dx1);
+ xs3= 1; /* flag */
+
+ }
+
+ for(y=my2;y>omsl;y--) {
+
+ sn1= xs0>>16;
+ xs0+= dx0;
+
+ sn2= xs1>>16;
+ xs1+= dx1;
+
+ sn1++;
+
+ if(sn2>=rectx) sn2= rectx-1;
+ if(sn1<0) sn1= 0;
+ zverg= (int) CLAMPIS((sn1*zxd+zy0), INT_MIN, INT_MAX);
+ apteller = apoffsetteller + sn1;
+ x= sn2-sn1;
+
+ zverg-= Azvoordeel;
+
+ while(x>=0) {
+ insertObject(apteller, /* RE_treat_face_as_opaque, */ zvlnr, RE_POLY, zverg, mask);
+ zverg+= zd;
+ apteller++;
+ x--;
+ }
+ zy0-= zyd;
+ apoffsetteller -= rectx;
+ }
+
+ if(xs3) {
+ xs0= xs1;
+ dx0= dx1;
+ }
+ if(xs0>xs2) {
+ xs3= xs0;
+ xs0= xs2;
+ xs2= xs3;
+ xs3= dx0;
+ dx0= dx2;
+ dx2= xs3;
+ }
+
+ for(; y>=my0; y--) {
+
+ sn1= xs0>>16;
+ xs0+= dx0;
+ sn2= xs2>>16;
+ xs2+= dx2;
+
+ sn1++;
+
+ if(sn2>=rectx) sn2= rectx-1;
+ if(sn1<0) sn1= 0;
+ zverg= (int) CLAMPIS((sn1*zxd+zy0), INT_MIN, INT_MAX);
+ apteller = apoffsetteller + sn1;
+ x= sn2-sn1;
+
+ zverg-= Azvoordeel;
+
+ while(x>=0) {
+ insertObject(apteller, /* RE_treat_face_as_opaque, */ zvlnr, RE_POLY, zverg, mask);
+ zverg+= zd;
+ apteller++;
+ x--;
+ }
+
+ zy0-=zyd;
+ apoffsetteller -= rectx;
+ }
+}
/* ------------------------------------------------------------------------- */
-int countAndSortPixelFaces(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
+static void zBufferFillEdge(unsigned int zvlnr, float *vec1, float *vec2)
+{
+ int apteller;
+ int start, end, x, y, oldx, oldy, ofs;
+ int dz, vergz, mask;
+ float dx, dy;
+ float v1[3], v2[3];
+
+ dx= vec2[0]-vec1[0];
+ dy= vec2[1]-vec1[1];
+
+ if(fabs(dx) > fabs(dy)) {
+
+ /* all lines from left to right */
+ if(vec1[0]<vec2[0]) {
+ VECCOPY(v1, vec1);
+ VECCOPY(v2, vec2);
+ }
+ else {
+ VECCOPY(v2, vec1);
+ VECCOPY(v1, vec2);
+ dx= -dx; dy= -dy;
+ }
+
+ start= floor(v1[0]);
+ end= start+floor(dx);
+ if(end >= zBufferWidth) end = zBufferWidth - 1;
+
+ oldy= floor(v1[1]);
+ dy/= dx;
+
+ vergz= v1[2];
+ vergz-= Azvoordeel;
+ dz= (v2[2]-v1[2])/dx;
+
+ apteller = zBufferWidth*(oldy-Aminy) +start;
+ mask = 1<<Zsample;
+
+ if(dy<0) ofs= -zBufferWidth;
+ else ofs= zBufferWidth;
+
+ for(x= start; x<=end; x++, /* ap++, */ apteller++) {
+
+ y= floor(v1[1]);
+ if(y!=oldy) {
+ oldy= y;
+ apteller += ofs;
+ }
+
+ if(x>=0 && y>=Aminy && y<=Amaxy) {
+ insertObject(apteller, /* RE_treat_face_as_opaque, */ zvlnr, RE_POLY, vergz, mask);
+ }
+
+ v1[1]+= dy;
+ vergz+= dz;
+ }
+ }
+ else {
+
+ /* all lines from top to bottom */
+ if(vec1[1]<vec2[1]) {
+ VECCOPY(v1, vec1);
+ VECCOPY(v2, vec2);
+ }
+ else {
+ VECCOPY(v2, vec1);
+ VECCOPY(v1, vec2);
+ dx= -dx; dy= -dy;
+ }
+
+ start= floor(v1[1]);
+ end= start+floor(dy);
+
+ if(start>Amaxy || end<Aminy) return;
+
+ if(end>Amaxy) end= Amaxy;
+
+ oldx= floor(v1[0]);
+ dx/= dy;
+
+ vergz= v1[2];
+ vergz-= Azvoordeel;
+ dz= (v2[2]-v1[2])/dy;
+
+ apteller = zBufferWidth*(start-Aminy) +oldx;
+
+ mask= 1<<Zsample;
+
+ if(dx<0) ofs= -1;
+ else ofs= 1;
+
+ for(y= start; y<=end; y++, apteller += zBufferWidth) {
+
+ x= floor(v1[0]);
+ if(x!=oldx) {
+ oldx= x;
+ apteller += ofs;
+ }
+
+ if(x>=0 && y>=Aminy && (x < zBufferWidth)) {
+ insertObject(apteller, /* RE_treat_face_as_opaque, */ zvlnr, RE_POLY, vergz, mask);
+ }
+
+ v1[0]+= dx;
+ vergz+= dz;
+ }
+ }
+}
+/* ------------------------------------------------------------------------- */
+
+/**
+ * Count and sort the list behind ap into buf. Sorts on min. distance.
+ * Low index <=> high z
+ */
+static int countAndSortPixelFaces(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
RE_APixstrExt *ap)
{
int totvlak; /* face counter */
@@ -397,7 +554,7 @@ int countAndSortPixelFaces(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
} else if (totvlak != 1) qsort(zrow, totvlak,
sizeof(int)*RE_PIXELFIELDSIZE, vergzvlak);
return totvlak;
-} /* end of int countAndSortPixelFaces(int* zrow,RE_APixstrExt *ap ) */
+}
/* ------------------------------------------------------------------------- */
/* Oversampler v3 - check CVS for older versions */
@@ -421,9 +578,10 @@ static int VR_cbuf[RE_MAX_FACES_PER_PIXEL][2];
/**
* Analyze the z-buffer, and pre-sample the colours.
*/
-int composeStack(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
+static int composeStack(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE], RE_COLBUFTYPE *collector,
struct RE_faceField* stack, int ptr,
- int totvlak, float x, float y, int osaNr) {
+ int totvlak, float x, float y, int osaNr)
+{
VlakRen *vlr= NULL;
float xs = 0.0;
float ys = 0.0; /* coordinates for the render-spot */
@@ -446,7 +604,7 @@ int composeStack(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
while ( (!saturated || (saturated && inconflict) ) && (totvlak > 0) ) {
totvlak--;
-
+
full_osa= 0;
if(R.osa && (zrow[totvlak][RE_TYPE] & RE_POLY)) {
vlr= RE_findOrAddVlak((zrow[totvlak][RE_INDEX]-1) & 0x7FFFFF);
@@ -461,7 +619,7 @@ int composeStack(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
if(mask & (1<<a)) {
xs= (float)x + jit[a][0];
ys= (float)y + jit[a][1];
- renderPixel(xs, ys, zrow[totvlak], 1<<a);
+ renderPixel(collector, xs, ys, zrow[totvlak], 1<<a);
accol[0] += collector[0]; accol[1] += collector[1]; accol[2] += collector[2]; accol[3] += collector[3];
div+= 1.0;
}
@@ -480,11 +638,11 @@ int composeStack(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
/* stack face ----------- */
stack[ptr].mask = zrow[totvlak][RE_MASK];
- stack[ptr].data = renderPixel(xs, ys, zrow[totvlak], stack[ptr].mask);
+ stack[ptr].data = renderPixel(collector, xs, ys, zrow[totvlak], stack[ptr].mask);
}
stack[ptr].faceType = zrow[totvlak][RE_TYPE];
cpFloatColV(collector, stack[ptr].colour);
-
+
/* This is done so that spothalos are properly overlayed on halos */
/* maybe we need to check the colour here... */
if(zrow[totvlak][RE_TYPE] & RE_POLY) VR_covered |= zrow[totvlak][RE_MASK];
@@ -541,7 +699,7 @@ int composeStack(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
ys= (float)y;
/* code identical for rendering empty sky pixel */
- renderSkyPixelFloat(xs, ys);
+ renderSkyPixelFloat(collector, xs, ys);
cpFloatColV(collector, colbuf);
if(R.flag & R_LAMPHALO) {
@@ -561,120 +719,94 @@ int composeStack(int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE],
return ptr;
}
-/*
- Start resolving the conflict: the stack is primed to the top-most valid
- layer on the stack. Call this layer n. Layer n has a conflict count of c.
- This means layers [ n - c, ..., n ]
+/* ------------------------------------------------------------------------- */
+
+/**
+ * Calculate the view depth to this object on this location, with
+ * the current view parameters in R.
*/
-int resolveConflict(struct RE_faceField* stack, int ptr, float x, float y) {
- int face;
- int layer;
- float dx, dy;
- float xs = 0.0;
- float ys = 0.0; /* coordinates for the render-spot */
- int i;
-
- for(i = 0; i< osaNr; i++) { /* per bin, buffer all faces */
- dx = jit[i][0];
- dy = jit[i][1];
- xs = (float)x + dx;
- ys = (float)y + dy;
-
- face = 0; /* only counts covering faces ------------------- */
- layer = 0; /* counts all faces ----------------------------- */
-
- while (layer < stack[ptr].conflictCount) {
- if ( (1<<i) & stack[ptr - layer].mask) {
- VR_cbuf[face][0] =
- calcDepth(xs, ys,
- stack[ptr - layer].data,
- stack[ptr - layer].faceType);
- VR_cbuf[face][1] = ptr - layer;
- face++;
- }
- layer++;
+static int calcDepth(float x, float y, void *data, int type)
+{
+ float view[3];
+
+ if (type & RE_POLY) {
+ VlakRen* vlr = (VlakRen*) data;
+ VertRen* v1;
+ float dvlak, deler, fac, hoco_z, hoco_w;
+ int zbuf_co;
+
+ v1 = vlr->v1;
+
+ /* vertex dot face normal: WCS */
+ dvlak= v1->co[0]*vlr->n[0]+v1->co[1]*vlr->n[1]+v1->co[2]*vlr->n[2];
+
+ /* jitter has been added to x, y ! */
+ /* view vector view: screen coords */
+ view[0]= (x+(R.xstart)+0.5);
+
+ if(R.flag & R_SEC_FIELD) {
+ if(R.r.mode & R_ODDFIELD) view[1]= (y + R.ystart)*R.ycor;
+ else view[1]= (y + R.ystart + 1.0)*R.ycor;
+ }
+ else view[1]= (y + R.ystart + 0.5)*R.ycor;
+
+
+ /* for pano, another rotation in the xz plane is needed.... */
+
+ /* this is ok, in WCS */
+ view[2]= -R.viewfac; /* distance to viewplane */
+
+ /* face normal dot view vector: but how can this work? */
+ deler = MTC_dot3Float(vlr->n, view);
+ if (deler!=0.0) fac = dvlak/deler;
+ else fac = 0.0;
+
+ /* indices are wrong.... but gives almost the right value? */
+ hoco_z = (fac*view[2]) * R.winmat[2][2] + R.winmat[3][2];
+ hoco_w = (fac*view[2]) * R.winmat[2][3] + R.winmat[3][3];
+
+ if(hoco_w!=0.0) zbuf_co = 0x7FFFFFFF*(hoco_z/hoco_w);
+ else zbuf_co= 0x7FFFFFFF;
+
+ return zbuf_co; /* z component of R.co */
+ } else if (type & RE_HALO) {
+ HaloRen* har = (HaloRen*) data;
+ return har->zBufDist;
+ }
+ return 0;
+}
+
+/**
+ * Blend source over dest, and leave result in dest. 1 pixel.
+ */
+static void blendOverFloat(int type, float* dest, float* source, void* data)
+{
+
+ if (type & RE_POLY) {
+ VlakRen *ver = (VlakRen*) data;
+ if ((ver->mat != NULL) && (ver->mat->add > RE_FACE_ADD_THRESHOLD)) {
+ char addf = (char) (ver->mat->add * 255.0);
+ addalphaAddfacFloat(dest, source, addf);
}
- qsort(VR_cbuf, face, sizeof(int)*2, vergzvlak);
- for(layer = 0; layer < face; layer++) {
- blendOverFloat(stack[VR_cbuf[layer][1]].faceType, /* type */
- sampcol + (4 * i), /* dest */
- stack[VR_cbuf[layer][1]].colour, /* src */
- stack[VR_cbuf[layer][1]].data); /* data */
- }
+ else
+ addAlphaOverFloat(dest, source);
+ } else if (type & RE_HALO) {
+ HaloRen *har= (HaloRen*) data;
+ addalphaAddfacFloat(dest, source, har->add);
+ } else if (type & RE_SKY) {
+ addAlphaOverFloat(dest, source);
}
-
- /* The number of layers that were handled. This is how many layers the */
- /* top-level algorithm needs to skip. */
- return stack[ptr].conflictCount;
+
}
-/* The colour stack is blended down in a pretty straight-forward manner, or */
-/* a part of the stack is re-evaluated to resolve the conflict. */
-/* About 25-30% of rendering time is eaten here! */
-void integrateStack(struct RE_faceField* stack, int ptr,
- float x,
- float y,
- int osaNr) {
- /* sample the colour stack: back to front ---------------------------- */
- /* is there a possible way to ignore alpha? this would save 25% work */
- ptr--;
- /* Little different now: let ptr point to the topmost valid face.*/
- while (ptr >= 0) {
- if (stack[ptr].conflictCount == 0) {
- /*
- No conflict: sample one colour into multiple bins
- */
- blendOverFloatRow(stack[ptr].faceType,
- sampcol,
- stack[ptr].colour,
- stack[ptr].data,
- stack[ptr].mask,
- osaNr);
- ptr--;
- } else {
- /*
- Recalc all z-values, and integrate per sub-pixel.
- */
- ptr -= resolveConflict(stack, ptr, x, y);
- }
- }
-
- /* Done sampling. Now we still need to fill in pixels that were not */
- /* covered at all It seems strange that we have to check for empty alpha */
- /* but somehow this is necessary. Check out the cover condition :).... */
-
- /* It is important that we find a more efficient algorithm here, because */
- /* this little loop eats _lots_ of cycles. */
-
- /* Should be integrated in the rest of the rendering... */
-
- if(R.flag & R_LAMPHALO) {
- float halocol[4];
- int i;
-
- renderSpotHaloPixel(x, y, halocol);
- /* test seems to be wrong? */
- if (halocol[3] > RE_EMPTY_COLOUR_FLOAT) {
- for (i = 0; i < osaNr; i++) {
- /* here's a pinch: if the pixel was only covered by a halo, */
- /* we still need to fill spothalo. How do we detect this? */
- if (!(VR_covered & (1 << i)))
- /* maybe a copy is enough here... */
- addAlphaOverFloat(sampcol + (4 * i), halocol);
- }
- }
- }
-}
/**
* New approach: sample substacks. Each substack is first copied into
* a stack buffer, and then blended down.
* */
-void integratePerSubStack(struct RE_faceField* stack,
- int ptr,
- float x,
- float y,
- int osaNr) {
+static void integratePerSubStack(float *sampcol, struct RE_faceField* stack,
+ int ptr, float x, float y, int osaNr)
+{
int i = 0;
int j = 0;
int k = 0;
@@ -838,38 +970,33 @@ void integratePerSubStack(struct RE_faceField* stack,
/* an RE_APixstrExt* array */
/* - redo the numbering to something more logical */
-void renderZBufLine(int y)
+static void renderZBufLine(int y, RE_COLBUFTYPE *colbuf1, RE_COLBUFTYPE *colbuf2, RE_COLBUFTYPE *colbuf3)
{
int zrow[RE_MAX_FACES_PER_PIXEL][RE_PIXELFIELDSIZE];
RE_APixstrExt *ap; /* iterator for the face-lists */
+ RE_COLBUFTYPE collector[4];
+ RE_COLBUFTYPE sampcol[RE_MAX_OSA_COUNT * 4];
+ RE_COLBUFTYPE *j = NULL; /* generic pixel pointer */
int apteller;
int x; /* pixel counter */
- RE_COLBUFTYPE *colbuf1; /* pointer into the line buffer */
- RE_COLBUFTYPE *colbuf2; /* pointer into the line buffer */
- RE_COLBUFTYPE *colbuf3; /* pointer into the line buffer */
- RE_COLBUFTYPE *j = NULL; /* generic pixel pointer */
int i; /* yet another counter */
int stackDepth; /* faces-behind-this-pixel counter */
struct RE_faceField RE_OSAstack[RE_MAX_FACES_PER_PIXEL + 1];
int RE_OSAstack_ptr; /* Points to the lowest empty field. The indexed */
/* field is NOT readable. */
- /* Prepare buffers and iterators */
- colbuf1 = AColourBuffer1;
- colbuf2 = AColourBuffer2;
- colbuf3 = AColourBuffer3;
-
+ /* Prepare iterators */
ap = APixbufExt + (zBufferWidth * (y - Aminy));
apteller = (zBufferWidth * (y - Aminy));
/* Rendering: give the right colour to this pixel (shade it) */
- for( x = 0; x < bufferWidth; x++, ap++, colbuf1+=4, colbuf2+=4, colbuf3+=4) {
+ for( x = 0; x < R.rectx; x++, ap++, colbuf1+=4, colbuf2+=4, colbuf3+=4) {
if(ap->t[0]) {
/* reset sample collector */
j = sampcol;
for(i = 0; i < osaNr; i++, j+=4) {
- j[0] = RE_ZERO_COLOUR_FLOAT; j[1] = RE_ZERO_COLOUR_FLOAT;
- j[2] = RE_ZERO_COLOUR_FLOAT; j[3] = RE_ZERO_COLOUR_FLOAT;
+ j[0] = 0.0f; j[1] = 0.0f;
+ j[2] = 0.0f; j[3] = 0.0f;
};
/* a. count and sort number of faces */
@@ -877,10 +1004,10 @@ void renderZBufLine(int y)
/* b,c. oversample all subpixels, then integrate */
RE_OSAstack_ptr = 0;
- RE_OSAstack_ptr = composeStack(zrow,
+ RE_OSAstack_ptr = composeStack(zrow, collector,
RE_OSAstack, RE_OSAstack_ptr,
stackDepth, x, y, osaNr);
- integratePerSubStack(RE_OSAstack, RE_OSAstack_ptr,
+ integratePerSubStack(sampcol, RE_OSAstack, RE_OSAstack_ptr,
x, y, osaNr);
/* d. Gamma corrected blending and Gaussian */
@@ -891,7 +1018,7 @@ void renderZBufLine(int y)
/* This is a bit dirty. Depending on sky-mode, the pixel is */
/* blended in differently. */
- renderSkyPixelFloat(x, y);
+ renderSkyPixelFloat(collector, x, y);
j = sampcol;
for(i = 0; i < osaNr; i++, j+=4) {
@@ -910,22 +1037,40 @@ void renderZBufLine(int y)
addAlphaOverFloat(colbuf2+4, collector);
}
}
- } /* End of pixel loop */
-
-} /* End of void renderZBufLine(int y) */
-
-
-/* ------------------------------------------------------------------------- */
-
-int fillZBufDistances()
-{
- int keepLooping = 1;
+ }
+}
- keepLooping = zBufferAllFaces(); /* Solid and transparent faces*/
- keepLooping = zBufferAllHalos() && keepLooping; /* ...and halos*/
- return keepLooping;
-} /* End of void fillZBufDistances() */
+/**
+ * Fills in distances of faces in the z buffer.
+ *
+ * Halo z buffering ----------------------------------------------
+ *
+ * A halo is treated here as a billboard: no z-extension, always
+ * oriented perpendicular to the viewer. The rest of the z-buffer
+ * stores face-numbers first, then calculates colours as the
+ * final image is rendered. We'll use the same approach here,
+ * which differs from the original method (which was add halos per
+ * scan line). This means that the z-buffer now also needs to
+ * store info about what sort of 'thing' the index refers to.
+ *
+ * Halo extension:
+ * h.maxy ---------
+ * | h.xs + h.rad
+ * | h.xs
+ * | h.xs - h.rad
+ * h.miny ---------
+ *
+ * These coordinates must be clipped to picture size.
+ * I'm not quite certain about halo numbering.
+ *
+ * Halos and jittering -------------------------------------------
+ *
+ * Halos were not jittered previously. Now they are. I wonder
+ * whether this may have some adverse effects here.
+
+ * @return 1 for succes, 0 if the operation was interrupted.
+ */
/* ------------------------------------------------------------------------- */
/* Transparent faces and the 'Azvoordeel' */
@@ -940,10 +1085,11 @@ int fillZBufDistances()
/* static int RE_treat_face_as_opaque; */
-int zBufferAllFaces(void)
+static int zBufferAllFaces(void)
{
+ VlakRen *vlr=NULL;
+ unsigned int zvlnr, faceCounter;
int keepLooping = 1;
- int faceCounter; /* counter for face number */
float vec[3], hoco[4], mul, zval, fval;
Material *ma=0;
@@ -955,18 +1101,18 @@ int zBufferAllFaces(void)
/* RE_treat_face_as_opaque = 1; */
while ( (faceCounter < R.totvlak) && keepLooping) {
- if((faceCounter & 255)==0) { Zvlr= R.blovl[faceCounter>>8]; }
- else Zvlr++;
+ if((faceCounter & 255)==0) { vlr= R.blovl[faceCounter>>8]; }
+ else vlr++;
- ma= Zvlr->mat;
+ ma= vlr->mat;
/* VERY dangerous construction... zoffs is set by a slide in the ui */
/* so it should be safe... */
if((ma->mode & (MA_ZTRA)) && (ma->zoffs != 0.0)) {
mul= 0x7FFFFFFF;
- zval= mul*(1.0+Zvlr->v1->ho[2]/Zvlr->v1->ho[3]);
+ zval= mul*(1.0+vlr->v1->ho[2]/vlr->v1->ho[3]);
- VECCOPY(vec, Zvlr->v1->co);
+ VECCOPY(vec, vlr->v1->co);
/* z is negatief, wordt anders geclipt */
vec[2]-= ma->zoffs;
RE_projectverto(vec, hoco); /* vec onto hoco */
@@ -977,18 +1123,18 @@ int zBufferAllFaces(void)
Azvoordeel= 0;
}
/* face number is used in the fill functions */
- Zvlnr = faceCounter + 1;
+ zvlnr = faceCounter + 1;
- if(Zvlr->flag & R_VISIBLE) { /* might test for this sooner... */
+ if(vlr->flag & R_VISIBLE) { /* might test for this sooner... */
- if(ma->mode & (MA_WIRE)) zbufclipwire(Zvlr);
+ if(ma->mode & (MA_WIRE)) zbufclipwire(zvlnr, vlr);
else {
- zbufclip(Zvlr->v1->ho, Zvlr->v2->ho, Zvlr->v3->ho,
- Zvlr->v1->clip, Zvlr->v2->clip, Zvlr->v3->clip);
- if(Zvlr->v4) {
- Zvlnr+= 0x800000; /* in a sense, the 'adjoint' face */
- zbufclip(Zvlr->v1->ho, Zvlr->v3->ho, Zvlr->v4->ho,
- Zvlr->v1->clip, Zvlr->v3->clip, Zvlr->v4->clip);
+ zbufclip(zvlnr, vlr->v1->ho, vlr->v2->ho, vlr->v3->ho,
+ vlr->v1->clip, vlr->v2->clip, vlr->v3->clip);
+ if(vlr->v4) {
+ zvlnr+= 0x800000; /* in a sense, the 'adjoint' face */
+ zbufclip(zvlnr, vlr->v1->ho, vlr->v3->ho, vlr->v4->ho,
+ vlr->v1->clip, vlr->v3->clip, vlr->v4->clip);
}
}
}
@@ -997,7 +1143,12 @@ int zBufferAllFaces(void)
}
return keepLooping;
-} /* End of int zBufferAllFaces(void) */
+}
+
+/**
+ * Fills in distances of halos in the z buffer.
+ * @return 1 for succes, 0 if the operation was interrupted.
+ */
/* ------------------------------------------------------------------------- */
/* We cheat a little here: we only fill the halo on the first pass, and we */
@@ -1005,7 +1156,7 @@ int zBufferAllFaces(void)
/* halos to be flat (billboards), so we do not have to correct the z range */
/* every time we insert a halo. Also, halos fall off to zero at the edges, */
/* so we can safely render them in pixels where they do not exist. */
-int zBufferAllHalos(void)
+static int zBufferAllHalos(void)
{
HaloRen *har = NULL;
unsigned int haloCounter = 0;
@@ -1065,334 +1216,34 @@ int zBufferAllHalos(void)
}
return keepLooping;
-} /* end of int zbufferAllHalos(void) */
-
-/* ------------------------------------------------------------------------- */
-void zBufferFillHalo(void)
-{
- /* so far, intentionally empty */
-} /* end of void zBufferFillHalo(void) */
-
-/* ------------------------------------------------------------------------- */
-void zBufferFillFace(float *v1, float *v2, float *v3)
-{
- /* Coordinates of the vertices are specified in ZCS */
- int apteller, apoffsetteller;
- double z0; /* used as temp var*/
- double xx1;
- double zxd,zyd,zy0, tmp;
- float *minv,*maxv,*midv;
- register int zverg,zvlak,x;
- int my0,my2,sn1,sn2,rectx,zd;
- int y,omsl,xs0,xs1,xs2,xs3, dx0,dx1,dx2, mask;
-
- /* These used to be doubles. We may want to change them back if the */
- /* loss of accuracy proves to be a problem? There does not seem to be */
- /* any performance issues here, so I'll just keep the doubles. */
- /* float vec0[3], vec1[3], vec2[3]; */
- double vec0[3], vec1[3], vec2[3];
-
- /* MIN MAX */
- /* sort vertices for min mid max y value */
- if(v1[1]<v2[1]) {
- if(v2[1]<v3[1]) { minv=v1; midv=v2; maxv=v3;}
- else if(v1[1]<v3[1]) { minv=v1; midv=v3; maxv=v2;}
- else { minv=v3; midv=v1; maxv=v2;}
- }
- else {
- if(v1[1]<v3[1]) { minv=v2; midv=v1; maxv=v3;}
- else if(v2[1]<v3[1]) { minv=v2; midv=v3; maxv=v1;}
- else { minv=v3; midv=v2; maxv=v1;}
- }
-
- if(minv[1] == maxv[1]) return; /* security to remove 'zero' size faces */
-
- my0 = ceil(minv[1]);
- my2 = floor(maxv[1]);
- omsl = floor(midv[1]);
-
- /* outside the current z buffer slice: clip whole face */
- if( (my2 < Aminy) || (my0 > Amaxy)) return;
-
- if(my0<Aminy) my0= Aminy;
-
- /* EDGES : THE LONGEST */
- xx1= maxv[1]-minv[1];
- if(xx1>2.0/65536.0) {
- z0= (maxv[0]-minv[0])/xx1;
-
- tmp= (-65536.0*z0);
- dx0= CLAMPIS(tmp, INT_MIN, INT_MAX);
-
- tmp= 65536.0*(z0*(my2-minv[1])+minv[0]);
- xs0= CLAMPIS(tmp, INT_MIN, INT_MAX);
- }
- else {
- dx0= 0;
- xs0= 65536.0*(MIN2(minv[0],maxv[0]));
- }
- /* EDGES : THE TOP ONE */
- xx1= maxv[1]-midv[1];
- if(xx1>2.0/65536.0) {
- z0= (maxv[0]-midv[0])/xx1;
-
- tmp= (-65536.0*z0);
- dx1= CLAMPIS(tmp, INT_MIN, INT_MAX);
-
- tmp= 65536.0*(z0*(my2-midv[1])+midv[0]);
- xs1= CLAMPIS(tmp, INT_MIN, INT_MAX);
- }
- else {
- dx1= 0;
- xs1= 65536.0*(MIN2(midv[0],maxv[0]));
- }
- /* EDGES : THE BOTTOM ONE */
- xx1= midv[1]-minv[1];
- if(xx1>2.0/65536.0) {
- z0= (midv[0]-minv[0])/xx1;
-
- tmp= (-65536.0*z0);
- dx2= CLAMPIS(tmp, INT_MIN, INT_MAX);
-
- tmp= 65536.0*(z0*(omsl-minv[1])+minv[0]);
- xs2= CLAMPIS(tmp, INT_MIN, INT_MAX);
- }
- else {
- dx2= 0;
- xs2= 65536.0*(MIN2(minv[0],midv[0]));
- }
-
- /* ZBUF DX DY */
- /* xyz_1 = v_1 - v_2 */
- MTC_diff3DFF(vec1, v1, v2);
- /* xyz_2 = v_2 - v_3 */
- MTC_diff3DFF(vec2, v2, v3);
- /* xyz_0 = xyz_1 cross xyz_2 */
- MTC_cross3Double(vec0, vec1, vec2);
-
- /* cross product of two of the sides is 0 => this face is too small */
- if(vec0[2]==0.0) return;
-
- if(midv[1] == maxv[1]) omsl= my2;
- if(omsl < Aminy) omsl= Aminy-1; /* make sure it takes the first loop entirely */
-
- while (my2 > Amaxy) { /* my2 can be larger */
- xs0+=dx0;
- if (my2<=omsl) {
- xs2+= dx2;
- }
- else{
- xs1+= dx1;
- }
- my2--;
- }
-
- xx1= (vec0[0]*v1[0]+vec0[1]*v1[1])/vec0[2]+v1[2];
-
- zxd= -vec0[0]/vec0[2];
- zyd= -vec0[1]/vec0[2];
- zy0= my2*zyd+xx1;
- zd= (int)CLAMPIS(zxd, INT_MIN, INT_MAX);
-
- /* start-ofset in rect */
- /* rectx= R.rectx; */
- /* I suspect this var needs very careful setting... When edge rendering */
- /* is on, this is strange */
- rectx = zBufferWidth;
- apoffsetteller = rectx*(my2-Aminy);
-
- mask= 1<<Zsample;
- zvlak= Zvlnr;
-
- xs3= 0; /* flag */
- if(dx0>dx1) {
- MTC_swapInt(&xs0, &xs1);
- MTC_swapInt(&dx0, &dx1);
- xs3= 1; /* flag */
-
- }
-
- for(y=my2;y>omsl;y--) {
-
- sn1= xs0>>16;
- xs0+= dx0;
-
- sn2= xs1>>16;
- xs1+= dx1;
-
- sn1++;
-
- if(sn2>=rectx) sn2= rectx-1;
- if(sn1<0) sn1= 0;
- zverg= (int) CLAMPIS((sn1*zxd+zy0), INT_MIN, INT_MAX);
- apteller = apoffsetteller + sn1;
- x= sn2-sn1;
-
- zverg-= Azvoordeel;
-
- while(x>=0) {
- insertObject(apteller, /* RE_treat_face_as_opaque, */ Zvlnr, RE_POLY, zverg, mask);
- zverg+= zd;
- apteller++;
- x--;
- }
- zy0-= zyd;
- apoffsetteller -= rectx;
- }
-
- if(xs3) {
- xs0= xs1;
- dx0= dx1;
- }
- if(xs0>xs2) {
- xs3= xs0;
- xs0= xs2;
- xs2= xs3;
- xs3= dx0;
- dx0= dx2;
- dx2= xs3;
- }
-
- for(; y>=my0; y--) {
-
- sn1= xs0>>16;
- xs0+= dx0;
-
- sn2= xs2>>16;
- xs2+= dx2;
-
- sn1++;
-
- if(sn2>=rectx) sn2= rectx-1;
- if(sn1<0) sn1= 0;
- zverg= (int) CLAMPIS((sn1*zxd+zy0), INT_MIN, INT_MAX);
- apteller = apoffsetteller + sn1;
- x= sn2-sn1;
-
- zverg-= Azvoordeel;
-
- while(x>=0) {
- insertObject(apteller, /* RE_treat_face_as_opaque, */ Zvlnr, RE_POLY, zverg, mask);
- zverg+= zd;
- apteller++;
- x--;
- }
-
- zy0-=zyd;
- apoffsetteller -= rectx;
- }
-} /* end of void zBufferFillFace(float *v1, float *v2, float *v3) */
-
+}
/* ------------------------------------------------------------------------- */
-void zBufferFillEdge(float *vec1, float *vec2)
+/**
+* Fills in distances of all faces in a z buffer, for given jitter settings.
+ */
+static int fillZBufDistances()
{
- int apteller;
- int start, end, x, y, oldx, oldy, ofs;
- int dz, vergz, mask;
- float dx, dy;
- float v1[3], v2[3];
+ int keepLooping = 1;
- dx= vec2[0]-vec1[0];
- dy= vec2[1]-vec1[1];
+ keepLooping = zBufferAllFaces(); /* Solid and transparent faces*/
+ keepLooping = zBufferAllHalos() && keepLooping; /* ...and halos*/
+ return keepLooping;
- if(fabs(dx) > fabs(dy)) {
+}
- /* all lines from left to right */
- if(vec1[0]<vec2[0]) {
- VECCOPY(v1, vec1);
- VECCOPY(v2, vec2);
- }
- else {
- VECCOPY(v2, vec1);
- VECCOPY(v1, vec2);
- dx= -dx; dy= -dy;
- }
- start= floor(v1[0]);
- end= start+floor(dx);
- if(end >= zBufferWidth) end = zBufferWidth - 1;
-
- oldy= floor(v1[1]);
- dy/= dx;
-
- vergz= v1[2];
- vergz-= Azvoordeel;
- dz= (v2[2]-v1[2])/dx;
-
- apteller = zBufferWidth*(oldy-Aminy) +start;
- mask = 1<<Zsample;
-
- if(dy<0) ofs= -zBufferWidth;
- else ofs= zBufferWidth;
-
- for(x= start; x<=end; x++, /* ap++, */ apteller++) {
-
- y= floor(v1[1]);
- if(y!=oldy) {
- oldy= y;
- apteller += ofs;
- }
-
- if(x>=0 && y>=Aminy && y<=Amaxy) {
- insertObject(apteller, /* RE_treat_face_as_opaque, */ Zvlnr, RE_POLY, vergz, mask);
- }
-
- v1[1]+= dy;
- vergz+= dz;
- }
- }
- else {
-
- /* all lines from top to bottom */
- if(vec1[1]<vec2[1]) {
- VECCOPY(v1, vec1);
- VECCOPY(v2, vec2);
- }
- else {
- VECCOPY(v2, vec1);
- VECCOPY(v1, vec2);
- dx= -dx; dy= -dy;
- }
- start= floor(v1[1]);
- end= start+floor(dy);
-
- if(start>Amaxy || end<Aminy) return;
-
- if(end>Amaxy) end= Amaxy;
-
- oldx= floor(v1[0]);
- dx/= dy;
-
- vergz= v1[2];
- vergz-= Azvoordeel;
- dz= (v2[2]-v1[2])/dy;
-
- apteller = zBufferWidth*(start-Aminy) +oldx;
-
- mask= 1<<Zsample;
-
- if(dx<0) ofs= -1;
- else ofs= 1;
- for(y= start; y<=end; y++, apteller += zBufferWidth) {
-
- x= floor(v1[0]);
- if(x!=oldx) {
- oldx= x;
- apteller += ofs;
- }
-
- if(x>=0 && y>=Aminy && (x < zBufferWidth)) {
- insertObject(apteller, /* RE_treat_face_as_opaque, */ Zvlnr, RE_POLY, vergz, mask);
- }
-
- v1[0]+= dx;
- vergz+= dz;
- }
- }
-} /* End of void zBufferFillEdge(float *vec1, float *vec2) */
+/* ------------------------------------------------------------------------- */
+/**
+ * One more filler: fill in halo data in z buffer.
+ * Empty so far, but may receive content of halo loop.
+ */
+void zBufferFillHalo(void)
+{
+ /* so far, intentionally empty */
+}
/* ------------------------------------------------------------------------- */
@@ -1401,11 +1252,12 @@ void zBufferFillEdge(float *vec1, float *vec2)
/* It expects the values R.r.postigamma, R.r.postmul and R.r.postadd. */
/* This is the standard transformation, more elaborate tools are for later. */
/* ------------------------------------------------------------------------- */
-void std_transFloatColV2CharColV( RE_COLBUFTYPE *buf, char *target)
+void std_floatcol_to_charcol( float *buf, char *target)
{
- float fval;
- float dither_value;
+ float col[3];
+ float dither_value;
+
dither_value = ((BLI_frand()-0.5)*R.r.dither_intensity)/256.0;
/* alpha */
@@ -1415,23 +1267,11 @@ void std_transFloatColV2CharColV( RE_COLBUFTYPE *buf, char *target)
if(R.r.postgamma==1.0) {
/* r */
- fval= R.r.postmul*buf[0] + R.r.postadd + dither_value;
- if(fval<=0.0) target[0]= 0;
- else if(fval>1.0) target[0]= 255;
- else target[0]= 255.0*fval;
-
+ col[0]= R.r.postmul*buf[0] + R.r.postadd + dither_value;
/* g */
- fval= R.r.postmul*buf[1] + R.r.postadd + dither_value;
- if(fval<=0.0) target[1]= 0;
- else if(fval>1.0) target[1]= 255;
- else target[1]= 255.0*fval;
-
+ col[1]= R.r.postmul*buf[1] + R.r.postadd + dither_value;
/* b */
- fval= R.r.postmul*buf[2] + R.r.postadd + dither_value;
- if(fval<=0.0) target[2]= 0;
- else if(fval>1.0) target[2]= 255;
- else target[2]= 255.0*fval;
-
+ col[2]= R.r.postmul*buf[2] + R.r.postadd + dither_value;
}
else {
/* putting the postmul within the pow() gives an
@@ -1439,28 +1279,37 @@ void std_transFloatColV2CharColV( RE_COLBUFTYPE *buf, char *target)
* are relevant then
*/
-
/* r */
- fval= pow(R.r.postmul*buf[0], R.r.postigamma) + R.r.postadd + dither_value;
- if(fval<=0.0) target[0]= 0;
- else if(fval>1.0) target[0]= 255;
- else target[0]= 255.0*fval;
-
+ col[0]= pow(R.r.postmul*buf[0], R.r.postigamma) + R.r.postadd + dither_value;
/* g */
- fval=pow( R.r.postmul*buf[1], R.r.postigamma) + R.r.postadd + dither_value;
- if(fval<=0.0) target[1]= 0;
- else if(fval>1.0) target[1]= 255;
- else target[1]= 255.0*fval;
-
+ col[1]= pow( R.r.postmul*buf[1], R.r.postigamma) + R.r.postadd + dither_value;
/* b */
- fval= pow(R.r.postmul*buf[2], R.r.postigamma) + R.r.postadd + dither_value;
- if(fval<=0.0) target[2]= 0;
- else if(fval>1.0) target[2]= 255;
- else target[2]= 255.0*fval;
+ col[2]= pow(R.r.postmul*buf[2], R.r.postigamma) + R.r.postadd + dither_value;
}
-} /* end of void std_transFloatColV2CharColV( RE_COLBUFTYPE *buf, uchar *target) */
+ if(R.r.posthue!=0.0 || R.r.postsat!=1.0) {
+ float hsv[3];
+
+ rgb_to_hsv(col[0], col[1], col[2], hsv, hsv+1, hsv+2);
+ hsv[0]+= R.r.posthue;
+ if(hsv[0]>1.0) hsv[0]-=1.0; else if(hsv[0]<0.0) hsv[0]+= 1.0;
+ hsv[1]*= R.r.postsat;
+ if(hsv[1]>1.0) hsv[1]= 1.0; else if(hsv[1]<0.0) hsv[1]= 0.0;
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2);
+ }
+
+ if(col[0]<=0.0) target[0]= 0;
+ else if(col[0]>1.0) target[0]= 255;
+ else target[0]= 255.0*col[0];
+
+ if(col[1]<=0.0) target[1]= 0;
+ else if(col[1]>1.0) target[1]= 255;
+ else target[1]= 255.0*col[1];
+ if(col[2]<=0.0) target[2]= 0;
+ else if(col[2]>1.0) target[2]= 255;
+ else target[2]= 255.0*col[2];
+}
/* ----------------------------------------------------------------------------
@@ -1485,26 +1334,26 @@ void std_transFloatColV2CharColV( RE_COLBUFTYPE *buf, char *target)
without setting Osa or Gamme flags off (ton)
---------------------------------------------------------------------------- */
-void transferColourBufferToOutput(int y)
+/* used external! */
+void transferColourBufferToOutput( float *buf, int y)
{
/* Copy the contents of AColourBuffer3 to R.rectot + y * R.rectx */
int x = 0;
- RE_COLBUFTYPE *buf = AColourBuffer3+4;
- char *target = (char*) (R.rectot + (y * imageWidth));
+ char *target = (char*) (R.rectot + (y * R.rectx));
- /* Copy the first <imageWidth> pixels. We can do some more clipping on */
+ /* Copy the first <R.rectx> pixels. We can do some more clipping on */
/* the z buffer, I think. */
- while (x < imageWidth) {
+ while (x < R.rectx) {
/* invert gamma corrected additions */
- if(osaNr!=1 && doGamma()) {
+ if(do_gamma) {
buf[0] = invGammaCorrect(buf[0]);
buf[1] = invGammaCorrect(buf[1]);
buf[2] = invGammaCorrect(buf[2]);
}
- std_transFloatColV2CharColV(buf, target);
+ std_floatcol_to_charcol(buf, target);
/*
Key-alpha mode:
@@ -1522,118 +1371,225 @@ void transferColourBufferToOutput(int y)
buf+=4;
x++;
}
-} /* end of void transferColourBufferToOutput(int y) */
+}
+
+/* used for redisplay after render. assumes size globals to be set OK! */
+void RE_floatbuffer_to_output(void)
+{
+ float *buf= R.rectftot;
+ int pix= R.rectx*R.recty;
+ char *target = (char *)R.rectot;
+
+ if(R.rectftot==NULL) return;
+
+ while(pix--) {
+ std_floatcol_to_charcol(buf, target);
+ buf+= 4;
+ target+= 4;
+ }
+}
/* ------------------------------------------------------------------------- */
-void eraseColBuf(RE_COLBUFTYPE *buf)
+static void eraseColBuf(RE_COLBUFTYPE *buf)
{
/* By definition, the buffer's length is 4 * R.rectx items */
int i = 0;
- while (i < 4 * (bufferWidth+3)) {
- *buf = RE_ZERO_COLOUR_FLOAT;
+ while (i < 4 * (R.rectx+3)) {
+ *buf = 0.0f;
buf++; i++;
}
-} /* End of void eraseColBuf(RE_COLBUFTYPE *buf) */
+}
/* ------------------------------------------------------------------------- */
-int calcDepth(float x, float y, void *data, int type)
+
+/**
+ * Fill the accumulation buffer APixbufExt with face and halo indices.
+ * Note: Uses globals.
+ * @param y the line number to set
+ */
+static void calcZBufLine(int y)
{
- float view[3];
+ /* These function pointers are used for z buffer filling. */
+ extern void (*zbuffunc)(unsigned int, float *, float *, float *);
+ extern void (*zbuflinefunc)(unsigned int, float *, float *);
+ int part;
+ int keepLooping = 1;
- if (type & RE_POLY) {
- VlakRen* vlr = (VlakRen*) data;
- VertRen* v1;
- float dvlak, deler, fac, hoco_z, hoco_w;
- int zbuf_co;
-
- v1 = vlr->v1;
-
- /* vertex dot face normal: WCS */
- dvlak= v1->co[0]*vlr->n[0]+v1->co[1]*vlr->n[1]+v1->co[2]*vlr->n[2];
-
- /* jitter has been added to x, y ! */
- /* view vector view: screen coords */
- view[0]= (x+(R.xstart)+0.5);
-
- if(R.flag & R_SEC_FIELD) {
- if(R.r.mode & R_ODDFIELD) view[1]= (y + R.ystart)*R.ycor;
- else view[1]= (y + R.ystart + 1.0)*R.ycor;
- }
- else view[1]= (y + R.ystart + 0.5)*R.ycor;
+ if(y<0) return;
+
+ /* zbuffer fix: here? */
+ Zmulx= ((float) R.rectx)/2.0;
+ Zmuly= ((float) R.recty)/2.0;
+
+
+ /* use these buffer fill functions */
+ zbuffunc = zBufferFillFace;
+ zbuflinefunc = zBufferFillEdge;
+
+ /* (FORALL y: Aminy =< y =< Amaxy: y is buffered) */
+ if( (y < Aminy) || (y > Amaxy)) {
+ /* prepare buffer */
+ part = (y/RE_ZBUFLEN); /* These two lines are mystifying me... */
+ Aminy = part * RE_ZBUFLEN; /* Possibly for rounding things? */
+ Amaxy = Aminy + RE_ZBUFLEN - 1;
+ /* if(Amaxy >= R.recty) Amaxy = R.recty-1; */
+ if(Amaxy >= R.recty) Amaxy = R.recty - 1;
+ resetZbuffer();
+ Zsample = 0; /* Zsample is used internally ! */
+ while ( (Zsample < osaNr) && keepLooping ) {
+ /* Apply jitter to this pixel. The jitter offsets are globals. */
+ /* They are added in zbufclip() */
+ /* Negative: these offsets are added to the vertex coordinates */
+ /* so it equals translating viewpoint over the positive vector. */
+ Zjitx= -jit[Zsample][0]-0.5;
+ Zjity= -jit[Zsample][1]-0.5;
+
+ keepLooping = fillZBufDistances();
+
+ if(RE_local_test_break()) keepLooping = 0;
+ Zsample++;
+ }
+ };
+
+}
- /* for pano, another rotation in the xz plane is needed.... */
- /* this is ok, in WCS */
- view[2]= -R.viewfac; /* distance to viewplane */
-
- /* face normal dot view vector: but how can this work? */
- deler = MTC_dot3Float(vlr->n, view);
- if (deler!=0.0) fac = dvlak/deler;
- else fac = 0.0;
-
- /* indices are wrong.... but gives almost the right value? */
- hoco_z = (fac*view[2]) * R.winmat[2][2] + R.winmat[3][2];
- hoco_w = (fac*view[2]) * R.winmat[2][3] + R.winmat[3][3];
-
- if(hoco_w!=0.0) zbuf_co = 0x7FFFFFFF*(hoco_z/hoco_w);
- else zbuf_co= 0x7FFFFFFF;
-
- return zbuf_co; /* z component of R.co */
- } else if (type & RE_HALO) {
- HaloRen* har = (HaloRen*) data;
- return har->zBufDist;
- }
- return 0;
-} /* end of int calcDepth(float x, float y, void* data, int type) */
+/* ------------------------------------------------------------------------- */
-/* Maybe these two should be in pixelblendeing.c---------------------------- */
+struct renderline {
+ RE_COLBUFTYPE *buf1, *buf2, *buf3;
+ int y;
+};
-void blendOverFloat(int type, float* dest, float* source, void* data)
+static int do_renderline(void *poin)
{
+ struct renderline *rl= poin;
+
+ renderZBufLine(rl->y, rl->buf1, rl->buf2, rl->buf3);
+ return 1;
+}
- if (type & RE_POLY) {
- VlakRen *ver = (VlakRen*) data;
- if ((ver->mat != NULL) && (ver->mat->add > RE_FACE_ADD_THRESHOLD)) {
- char addf = (char) (ver->mat->add * 255.0);
- addalphaAddfacFloat(dest, source, addf);
- }
- else
- addAlphaOverFloat(dest, source);
- } else if (type & RE_HALO) {
- HaloRen *har= (HaloRen*) data;
- addalphaAddfacFloat(dest, source, har->add);
- } else if (type & RE_SKY) {
- addAlphaOverFloat(dest, source);
+void zBufShadeAdvanced()
+{
+ RE_COLBUFTYPE *cycle;
+ struct renderline rl1, rl2;
+ int y, keepLooping = 1;
+ float xjit = 0.0, yjit = 0.0;
+
+ Zjitx=Zjity= -0.5; /* jitter preset: -0.5 pixel */
+
+ /* Set osaNr. Treat 'no osa' as 'osa = 1' */
+ if(R.r.mode & R_OSA) {
+ osaNr = R.osa;
+ if(osaNr > 16) { /* check was moved from calcZBufLine */
+ printf("zBufShadeAdvanced> osa too large (internal error)\n");
+ G.afbreek= 1;
+ return;
+ }
+ } else {
+ /* little hack */
+ osaNr = 1;
+ xjit = jit[0][0];
+ yjit = jit[0][1];
+ jit[0][0] = 0.0;
+ jit[0][1] = 0.0;
+ }
+
+ RE_setwindowclip(0, -1); /* just to be sure, reset the view matrix */
+
+ initRenderBuffers(R.rectx);
+
+ y = 0;
+ while ( (y < R.recty) && keepLooping) {
+
+ calcZBufLine(y);
+
+ rl1.buf1= AColourBuffer1;
+ rl1.buf2= AColourBuffer2;
+ rl1.buf3= AColourBuffer3;
+ rl1.y= y;
+
+ if(R.r.mode & R_THREADS) {
+ if((y & 1)==0) {
+ SDL_Thread *thread;
+
+ thread = SDL_CreateThread(do_renderline, &rl1);
+ if ( thread == NULL ) {
+ fprintf(stderr, "Unable to create thread");
+ G.afbreek= 1;
+ break;
+ }
+
+ rl2.buf1= AColourBuffer0;
+ rl2.buf2= AColourBuffer1a;
+ rl2.buf3= AColourBuffer2a;
+ rl2.y= y+1;
+
+ do_renderline(&rl2);
+
+ SDL_WaitThread(thread, NULL);
+
+ if(R.r.mode & R_GAUSS) {
+ float *rb1= AColourBuffer1, *rb2= AColourBuffer2, *rb1a= AColourBuffer1a, *rb2a= AColourBuffer2a;
+ int a= 4*(R.rectx + 4);
+ while(a--) {
+ *rb1 += *rb1a;
+ *rb2 += *rb2a;
+ *(rb1a++)= 0.0; rb1++;
+ *(rb2a++)= 0.0; rb2++;
+ }
+ }
+ else {
+ cycle= AColourBuffer1a; AColourBuffer1a= AColourBuffer1; AColourBuffer1= cycle;
+ }
+ }
+ }
+ else do_renderline(&rl1);
+
+ if(y) {
+ transferColourBufferToOutput(AColourBuffer3+4, y-1);
+
+ if((y & 1)==0) RE_local_render_display(y-2, y-1, R.rectx, R.recty, R.rectot);
+ }
+
+ /* buffer cycling */
+ eraseColBuf(AColourBuffer3);
+ cycle= AColourBuffer3;
+ AColourBuffer3= AColourBuffer2;
+ AColourBuffer2= AColourBuffer1;
+ AColourBuffer1= AColourBuffer0;
+ AColourBuffer0= cycle;
+
+ if(RE_local_test_break()) keepLooping = 0;
+ y++;
}
+ if(keepLooping) transferColourBufferToOutput(AColourBuffer3+4, y-1);
-} /* end of void blendOverFloat(int , float*, float*, void*) */
+ freeRenderBuffers();
-/* ------------------------------------------------------------------------- */
-void blendOverFloatRow(int type, float* dest, float* source,
- void* data, int mask, int osaNr)
-{
-
- if (type & RE_POLY) {
- VlakRen *ver = (VlakRen*) data;
- if ((ver->mat != NULL)
- && (ver->mat->add > RE_FACE_ADD_THRESHOLD)) {
- char addf = (ver->mat->add * 255.0);
- addAddSampColF(dest, source, mask, osaNr, addf);
- } else {
- addOverSampColF(dest, source, mask, osaNr);
- }
- } else if (type & RE_HALO) {
- HaloRen *har = (HaloRen*) data;
- addAddSampColF(dest, source, mask, osaNr, har->add);
- } else if (type & RE_SKY) {
- addOverSampColF(dest, source, mask, osaNr);
+ /* Edge rendering is done purely as a post-effect */
+ if(R.r.mode & R_EDGE) {
+ addEdges((char*)R.rectot, R.rectx, R.recty,
+ osaNr,
+ R.r.edgeint, R.r.same_mat_redux,
+ G.compat, G.notonlysolid,
+ R.r.edgeR, R.r.edgeG, R.r.edgeB);
+ }
+
+ if (!(R.r.mode & R_OSA)) {
+ jit[0][0] = xjit;
+ jit[0][1] = yjit;
}
-} /* end of void blendOverFloatRow(int, float*, float*, void*) */
+
+}
/* ------------------------------------------------------------------------- */
+
+
+
/* eof vanillaRenderPipe.c */
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 145e9409c18..4da409a58c4 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -41,44 +41,35 @@
#include "MTC_matrixops.h"
#include "MEM_guardedalloc.h"
-#include "BKE_global.h"
-
#include "DNA_lamp_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "BKE_global.h"
+#include "BKE_utildefines.h"
+
#include "radio_types.h"
#include "radio.h" /* needs RG, some root data for radiosity */
+#include "SDL_thread.h"
+
#include "render.h"
-#include "render_intern.h"
#include "RE_callbacks.h"
-#include "old_zbuffer_types.h"
+
/* local includes */
-/* can be removed when the old renderer disappears */
#include "rendercore.h" /* shade_pixel and count_mask */
#include "pixelblending.h"
#include "jitter.h"
/* own includes */
#include "zbuf.h"
-#include "zbuf_int.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-/* crud */
-#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
/*-----------------------------------------------------------*/
/* Globals for this file */
+/* main reason for globals; unified zbuffunc() with simple args */
/*-----------------------------------------------------------*/
-extern float centLut[16];
-extern char *centmask;
-
-float *vlzp[32][3], labda[3][2], vez[400], *p[40];
-
float Zmulx; /* Half the screenwidth, in pixels. (used in render.c, */
/* zbuf.c) */
float Zmuly; /* Half the screenheight, in pixels. (used in render.c,*/
@@ -88,13 +79,11 @@ float Zjitx; /* Jitter offset in x. When jitter is disabled, this */
float Zjity; /* Jitter offset in y. When jitter is disabled, this */
/* should be 0.5. (used in render.c, zbuf.c) */
-unsigned int Zvlnr, Zsample;
-VlakRen *Zvlr;
-void (*zbuffunc)(float *, float *, float *);
-void (*zbuflinefunc)(float *, float *);
+unsigned int Zsample;
+void (*zbuffunc)(unsigned int, float *, float *, float *);
+void (*zbuflinefunc)(unsigned int, float *, float *);
APixstr *APixbuf; /* Zbuffer: linked list of face indices */
-unsigned short *Acolrow; /* Zbuffer: colour buffer, one line high */
int *Arectz; /* Zbuffer: distance buffer, almost obsolete */
int Aminy; /* y value of first line in the accu buffer */
int Amaxy; /* y value of last line in the accu buffer */
@@ -119,6 +108,63 @@ void fillrect(unsigned int *rect, int x, unsigned int y, unsigned int val)
}
}
+/**
+* Tests whether this coordinate is 'inside' or 'outside' of the view
+ * volume? By definition, this is in [0, 1].
+ * @param p vertex z difference plus coordinate difference?
+ * @param q origin z plus r minus some coordinate?
+ * @param u1 [in/out] clip fraction for ?
+ * @param u2 [in/out]
+ * @return 0 if point is outside, or 1 if the point lies on the clip
+ * boundary
+ */
+static short cliptestf(float p, float q, float *u1, float *u2)
+{
+ float r;
+
+ if(p<0.0) {
+ if(q<p) return 0;
+ else if(q<0.0) {
+ r= q/p;
+ if(r>*u2) return 0;
+ else if(r>*u1) *u1=r;
+ }
+ }
+ else {
+ if(p>0.0) {
+ if(q<0.0) return 0;
+ else if(q<p) {
+ r= q/p;
+ if(r<*u1) return 0;
+ else if(r<*u2) *u2=r;
+ }
+ }
+ else if(q<0.0) return 0;
+ }
+ return 1;
+}
+
+int RE_testclip(float *v)
+{
+ float abs4; /* WATCH IT: this function should do the same as cliptestf, otherwise troubles in zbufclip()*/
+ short c=0;
+
+ abs4= fabs(v[3]);
+
+ if(v[2]< -abs4) c=16; /* this used to be " if(v[2]<0) ", see clippz() */
+ else if(v[2]> abs4) c+= 32;
+
+ if( v[0]>abs4) c+=2;
+ else if( v[0]< -abs4) c+=1;
+
+ if( v[1]>abs4) c+=4;
+ else if( v[1]< -abs4) c+=8;
+
+ return c;
+}
+
+
+
/* ************* ACCUMULATION ZBUF ************ */
/*-APixstr---------------------(antialised pixel struct)------------------------------*/
@@ -176,8 +222,17 @@ APixstr *addpsA(void)
return prev;
}
-/* fills in color, with window coordinate, from Aminy->Amaxy */
-void zbufinvulAc(float *v1, float *v2, float *v3)
+/**
+ * Fill the z buffer for accumulation (transparency)
+ *
+ * This is one of the z buffer fill functions called in zbufclip() and
+ * zbufwireclip().
+ *
+ * @param v1 [4 floats, world coordinates] first vertex
+ * @param v2 [4 floats, world coordinates] second vertex
+ * @param v3 [4 floats, world coordinates] third vertex
+ */
+void zbufinvulAc(unsigned int zvlnr, float *v1, float *v2, float *v3)
{
APixstr *ap, *apofs, *apn;
double x0,y0,z0,x1,y1,z1,x2,y2,z2,xx1;
@@ -341,14 +396,14 @@ void zbufinvulAc(float *v1, float *v2, float *v3)
if(zverg< *rz) {
apn= ap;
while(apn) { /* loop unrolled */
- if(apn->p[0]==0) {apn->p[0]= Zvlnr; apn->z[0]= zverg; apn->mask[0]= mask; break; }
- if(apn->p[0]==Zvlnr) {apn->mask[0]|= mask; break; }
- if(apn->p[1]==0) {apn->p[1]= Zvlnr; apn->z[1]= zverg; apn->mask[1]= mask; break; }
- if(apn->p[1]==Zvlnr) {apn->mask[1]|= mask; break; }
- if(apn->p[2]==0) {apn->p[2]= Zvlnr; apn->z[2]= zverg; apn->mask[2]= mask; break; }
- if(apn->p[2]==Zvlnr) {apn->mask[2]|= mask; break; }
- if(apn->p[3]==0) {apn->p[3]= Zvlnr; apn->z[3]= zverg; apn->mask[3]= mask; break; }
- if(apn->p[3]==Zvlnr) {apn->mask[3]|= mask; break; }
+ if(apn->p[0]==0) {apn->p[0]= zvlnr; apn->z[0]= zverg; apn->mask[0]= mask; break; }
+ if(apn->p[0]==zvlnr) {apn->mask[0]|= mask; break; }
+ if(apn->p[1]==0) {apn->p[1]= zvlnr; apn->z[1]= zverg; apn->mask[1]= mask; break; }
+ if(apn->p[1]==zvlnr) {apn->mask[1]|= mask; break; }
+ if(apn->p[2]==0) {apn->p[2]= zvlnr; apn->z[2]= zverg; apn->mask[2]= mask; break; }
+ if(apn->p[2]==zvlnr) {apn->mask[2]|= mask; break; }
+ if(apn->p[3]==0) {apn->p[3]= zvlnr; apn->z[3]= zverg; apn->mask[3]= mask; break; }
+ if(apn->p[3]==zvlnr) {apn->mask[3]|= mask; break; }
if(apn->next==0) apn->next= addpsA();
apn= apn->next;
}
@@ -399,14 +454,14 @@ void zbufinvulAc(float *v1, float *v2, float *v3)
if(zverg< *rz) {
apn= ap;
while(apn) { /* loop unrolled */
- if(apn->p[0]==0) {apn->p[0]= Zvlnr; apn->z[0]= zverg; apn->mask[0]= mask; break; }
- if(apn->p[0]==Zvlnr) {apn->mask[0]|= mask; break; }
- if(apn->p[1]==0) {apn->p[1]= Zvlnr; apn->z[1]= zverg; apn->mask[1]= mask; break; }
- if(apn->p[1]==Zvlnr) {apn->mask[1]|= mask; break; }
- if(apn->p[2]==0) {apn->p[2]= Zvlnr; apn->z[2]= zverg; apn->mask[2]= mask; break; }
- if(apn->p[2]==Zvlnr) {apn->mask[2]|= mask; break; }
- if(apn->p[3]==0) {apn->p[3]= Zvlnr; apn->z[3]= zverg; apn->mask[3]= mask; break; }
- if(apn->p[3]==Zvlnr) {apn->mask[3]|= mask; break; }
+ if(apn->p[0]==0) {apn->p[0]= zvlnr; apn->z[0]= zverg; apn->mask[0]= mask; break; }
+ if(apn->p[0]==zvlnr) {apn->mask[0]|= mask; break; }
+ if(apn->p[1]==0) {apn->p[1]= zvlnr; apn->z[1]= zverg; apn->mask[1]= mask; break; }
+ if(apn->p[1]==zvlnr) {apn->mask[1]|= mask; break; }
+ if(apn->p[2]==0) {apn->p[2]= zvlnr; apn->z[2]= zverg; apn->mask[2]= mask; break; }
+ if(apn->p[2]==zvlnr) {apn->mask[2]|= mask; break; }
+ if(apn->p[3]==0) {apn->p[3]= zvlnr; apn->z[3]= zverg; apn->mask[3]= mask; break; }
+ if(apn->p[3]==zvlnr) {apn->mask[3]|= mask; break; }
if(apn->next==0) apn->next= addpsA();
apn= apn->next;
}
@@ -423,7 +478,7 @@ void zbufinvulAc(float *v1, float *v2, float *v3)
}
}
-void zbuflineAc(float *vec1, float *vec2)
+void zbuflineAc(unsigned int zvlnr, float *vec1, float *vec2)
{
APixstr *ap, *apn;
unsigned int *rectz;
@@ -480,14 +535,14 @@ void zbuflineAc(float *vec1, float *vec2)
apn= ap;
while(apn) { /* loop unrolled */
- if(apn->p[0]==0) {apn->p[0]= Zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
- if(apn->p[0]==Zvlnr) {apn->mask[0]|= mask; break; }
- if(apn->p[1]==0) {apn->p[1]= Zvlnr; apn->z[1]= vergz; apn->mask[1]= mask; break; }
- if(apn->p[1]==Zvlnr) {apn->mask[1]|= mask; break; }
- if(apn->p[2]==0) {apn->p[2]= Zvlnr; apn->z[2]= vergz; apn->mask[2]= mask; break; }
- if(apn->p[2]==Zvlnr) {apn->mask[2]|= mask; break; }
- if(apn->p[3]==0) {apn->p[3]= Zvlnr; apn->z[3]= vergz; apn->mask[3]= mask; break; }
- if(apn->p[3]==Zvlnr) {apn->mask[3]|= mask; break; }
+ if(apn->p[0]==0) {apn->p[0]= zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
+ if(apn->p[0]==zvlnr) {apn->mask[0]|= mask; break; }
+ if(apn->p[1]==0) {apn->p[1]= zvlnr; apn->z[1]= vergz; apn->mask[1]= mask; break; }
+ if(apn->p[1]==zvlnr) {apn->mask[1]|= mask; break; }
+ if(apn->p[2]==0) {apn->p[2]= zvlnr; apn->z[2]= vergz; apn->mask[2]= mask; break; }
+ if(apn->p[2]==zvlnr) {apn->mask[2]|= mask; break; }
+ if(apn->p[3]==0) {apn->p[3]= zvlnr; apn->z[3]= vergz; apn->mask[3]= mask; break; }
+ if(apn->p[3]==zvlnr) {apn->mask[3]|= mask; break; }
if(apn->next==0) apn->next= addpsA();
apn= apn->next;
}
@@ -547,14 +602,14 @@ void zbuflineAc(float *vec1, float *vec2)
apn= ap;
while(apn) { /* loop unrolled */
- if(apn->p[0]==0) {apn->p[0]= Zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
- if(apn->p[0]==Zvlnr) {apn->mask[0]|= mask; break; }
- if(apn->p[1]==0) {apn->p[1]= Zvlnr; apn->z[1]= vergz; apn->mask[1]= mask; break; }
- if(apn->p[1]==Zvlnr) {apn->mask[1]|= mask; break; }
- if(apn->p[2]==0) {apn->p[2]= Zvlnr; apn->z[2]= vergz; apn->mask[2]= mask; break; }
- if(apn->p[2]==Zvlnr) {apn->mask[2]|= mask; break; }
- if(apn->p[3]==0) {apn->p[3]= Zvlnr; apn->z[3]= vergz; apn->mask[3]= mask; break; }
- if(apn->p[3]==Zvlnr) {apn->mask[3]|= mask; break; }
+ if(apn->p[0]==0) {apn->p[0]= zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
+ if(apn->p[0]==zvlnr) {apn->mask[0]|= mask; break; }
+ if(apn->p[1]==0) {apn->p[1]= zvlnr; apn->z[1]= vergz; apn->mask[1]= mask; break; }
+ if(apn->p[1]==zvlnr) {apn->mask[1]|= mask; break; }
+ if(apn->p[2]==0) {apn->p[2]= zvlnr; apn->z[2]= vergz; apn->mask[2]= mask; break; }
+ if(apn->p[2]==zvlnr) {apn->mask[2]|= mask; break; }
+ if(apn->p[3]==0) {apn->p[3]= zvlnr; apn->z[3]= vergz; apn->mask[3]= mask; break; }
+ if(apn->p[3]==zvlnr) {apn->mask[3]|= mask; break; }
if(apn->next==0) apn->next= addpsA();
apn= apn->next;
}
@@ -572,7 +627,16 @@ void zbuflineAc(float *vec1, float *vec2)
/* ************* NORMAL ZBUFFER ************ */
-void hoco_to_zco(float *zco, float *hoco)
+/**
+ * Convert a homogenous coordinate to a z buffer coordinate. The
+ * function makes use of Zmulx, Zmuly, the x and y scale factors for
+ * the screen, and Zjitx, Zjity, the pixel offset. (These are declared
+ * in render.c) The normalised z coordinate must fall on [0, 1].
+ * @param zco [3, 4 floats] pointer to the resulting z buffer coordinate
+ * @param hoco [4 floats] pointer to the homogenous coordinate of the
+ * vertex in world space.
+ */
+static void hoco_to_zco(float *zco, float *hoco)
{
float deler;
@@ -582,8 +646,7 @@ void hoco_to_zco(float *zco, float *hoco)
zco[2]= 0x7FFFFFFF *(hoco[2]/deler);
}
-void zbufline(vec1, vec2)
-float *vec1, *vec2;
+void zbufline(unsigned int zvlnr, float *vec1, float *vec2)
{
unsigned int *rectz, *rectp;
int start, end, x, y, oldx, oldy, ofs;
@@ -635,7 +698,7 @@ float *vec1, *vec2;
if(x>=0 && y>=0 && y<R.recty) {
if(vergz<*rectz) {
*rectz= vergz;
- *rectp= Zvlnr;
+ *rectp= zvlnr;
}
}
@@ -684,7 +747,7 @@ float *vec1, *vec2;
if(x>=0 && y>=0 && x<R.rectx) {
if(vergz<*rectz) {
*rectz= vergz;
- *rectp= Zvlnr;
+ *rectp= zvlnr;
}
}
@@ -694,10 +757,60 @@ float *vec1, *vec2;
}
}
+static int clipline(float *v1, float *v2) /* return 0: do not draw */
+{
+ float dz,dw, u1=0.0, u2=1.0;
+ float dx, dy, v13;
+
+ dz= v2[2]-v1[2];
+ dw= v2[3]-v1[3];
+
+ /* this 1.01 is for clipping x and y just a tinsy larger. that way it is
+ filled in with zbufwire correctly when rendering in parts. otherwise
+ you see line endings at edges... */
+
+ if(cliptestf(-dz-dw, v1[3]+v1[2], &u1,&u2)) {
+ if(cliptestf(dz-dw, v1[3]-v1[2], &u1,&u2)) {
+
+ dx= v2[0]-v1[0];
+ dz= 1.01*(v2[3]-v1[3]);
+ v13= 1.01*v1[3];
+
+ if(cliptestf(-dx-dz, v1[0]+v13, &u1,&u2)) {
+ if(cliptestf(dx-dz, v13-v1[0], &u1,&u2)) {
+
+ dy= v2[1]-v1[1];
+
+ if(cliptestf(-dy-dz, v1[1]+v13, &u1,&u2)) {
+ if(cliptestf(dy-dz, v13-v1[1], &u1,&u2)) {
+
+ if(u2<1.0) {
+ v2[0]= v1[0]+u2*dx;
+ v2[1]= v1[1]+u2*dy;
+ v2[2]= v1[2]+u2*dz;
+ v2[3]= v1[3]+u2*dw;
+ }
+ if(u1>0.0) {
+ v1[0]= v1[0]+u1*dx;
+ v1[1]= v1[1]+u1*dy;
+ v1[2]= v1[2]+u1*dz;
+ v1[3]= v1[3]+u1*dw;
+ }
+ return 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
-void zbufclipwire(VlakRen *vlr)
+void zbufclipwire(unsigned int zvlnr, VlakRen *vlr)
{
- float *f1, *f2, *f3, *f4= 0, deler;
+ float vez[20], *f1, *f2, *f3, *f4= 0, deler;
int c1, c2, c3, c4, ec, and, or;
/* edgecode: 1= draw */
@@ -735,7 +848,7 @@ void zbufclipwire(VlakRen *vlr)
if( clipline(vez, vez+4)) {
hoco_to_zco(vez, vez);
hoco_to_zco(vez+4, vez+4);
- zbuflinefunc(vez, vez+4);
+ zbuflinefunc(zvlnr, vez, vez+4);
}
}
if(ec & ME_V2V3) {
@@ -744,7 +857,7 @@ void zbufclipwire(VlakRen *vlr)
if( clipline(vez, vez+4)) {
hoco_to_zco(vez, vez);
hoco_to_zco(vez+4, vez+4);
- zbuflinefunc(vez, vez+4);
+ zbuflinefunc(zvlnr, vez, vez+4);
}
}
if(vlr->v4) {
@@ -754,7 +867,7 @@ void zbufclipwire(VlakRen *vlr)
if( clipline(vez, vez+4)) {
hoco_to_zco(vez, vez);
hoco_to_zco(vez+4, vez+4);
- zbuflinefunc(vez, vez+4);
+ zbuflinefunc(zvlnr, vez, vez+4);
}
}
if(ec & ME_V4V1) {
@@ -763,7 +876,7 @@ void zbufclipwire(VlakRen *vlr)
if( clipline(vez, vez+4)) {
hoco_to_zco(vez, vez);
hoco_to_zco(vez+4, vez+4);
- zbuflinefunc(vez, vez+4);
+ zbuflinefunc(zvlnr, vez, vez+4);
}
}
}
@@ -774,7 +887,7 @@ void zbufclipwire(VlakRen *vlr)
if( clipline(vez, vez+4)) {
hoco_to_zco(vez, vez);
hoco_to_zco(vez+4, vez+4);
- zbuflinefunc(vez, vez+4);
+ zbuflinefunc(zvlnr, vez, vez+4);
}
}
}
@@ -804,24 +917,30 @@ void zbufclipwire(VlakRen *vlr)
vez[13]= Zmuly*(1.0+f4[1]/deler)+ Zjity;
vez[14]= 0x7FFFFFFF *(f4[2]/deler);
- if(ec & ME_V3V4) zbuflinefunc(vez+8, vez+12);
- if(ec & ME_V4V1) zbuflinefunc(vez+12, vez);
+ if(ec & ME_V3V4) zbuflinefunc(zvlnr, vez+8, vez+12);
+ if(ec & ME_V4V1) zbuflinefunc(zvlnr, vez+12, vez);
}
else {
- if(ec & ME_V3V1) zbuflinefunc(vez+8, vez);
+ if(ec & ME_V3V1) zbuflinefunc(zvlnr, vez+8, vez);
}
- if(ec & ME_V1V2) zbuflinefunc(vez, vez+4);
- if(ec & ME_V2V3) zbuflinefunc(vez+4, vez+8);
-
-
+ if(ec & ME_V1V2) zbuflinefunc(zvlnr, vez, vez+4);
+ if(ec & ME_V2V3) zbuflinefunc(zvlnr, vez+4, vez+8);
}
-void zbufinvulGLinv(v1,v2,v3)
-float *v1,*v2,*v3;
-/* fills in R.rectot the value of Zvlnr using R.rectz */
-/* INVERSE Z COMPARISION: BACKSIDE GETS VISIBLE */
+/**
+ * Fill the z buffer, but invert z order, and add the face index to
+ * the corresponing face buffer.
+ *
+ * This is one of the z buffer fill functions called in zbufclip() and
+ * zbufwireclip().
+ *
+ * @param v1 [4 floats, world coordinates] first vertex
+ * @param v2 [4 floats, world coordinates] second vertex
+ * @param v3 [4 floats, world coordinates] third vertex
+ */
+static void zbufinvulGLinv(unsigned int zvlnr, float *v1, float *v2, float *v3)
{
double x0,y0,z0,x1,y1,z1,x2,y2,z2,xx1;
double zxd,zyd,zy0,tmp;
@@ -947,7 +1066,7 @@ float *v1,*v2,*v3;
rectx= R.rectx;
rectzofs= (int *)(R.rectz+rectx*my2);
rectpofs= (R.rectot+rectx*my2);
- zvlak= Zvlnr;
+ zvlak= zvlnr;
xs3= 0; /* flag */
if(dx0>dx1) {
@@ -1038,7 +1157,20 @@ float *v1,*v2,*v3;
}
}
-void zbufinvulGL(float *v1, float *v2, float *v3) /* fills in R.rectot the value Zvlnr using R.rectz */
+/**
+* Fill the z buffer, and add the face index to
+ * the corresponing face buffer. Writes into R.rectz and R.rectot. It
+ * assumes that zvlnr is set to the face index of the face under
+ * consideration. zvlnr is written into R.rectot. R.rectz
+ *
+ * This is one of the z buffer fill functions called in zbufclip() and
+ * zbufwireclip().
+ *
+ * @param v1 [4 floats, world coordinates] first vertex
+ * @param v2 [4 floats, world coordinates] second vertex
+ * @param v3 [4 floats, world coordinates] third vertex
+ */
+static void zbufinvulGL(unsigned int zvlnr, float *v1, float *v2, float *v3)
{
double x0,y0,z0;
double x1,y1,z1,x2,y2,z2,xx1;
@@ -1155,7 +1287,7 @@ void zbufinvulGL(float *v1, float *v2, float *v3) /* fills in R.rectot the valu
rectx= R.rectx;
rectzofs= (int *)(R.rectz+rectx*my2);
rectpofs= (R.rectot+rectx*my2);
- zvlak= Zvlnr;
+ zvlak= zvlnr;
xs3= 0; /* flag */
if(dx0>dx1) {
@@ -1248,8 +1380,18 @@ void zbufinvulGL(float *v1, float *v2, float *v3) /* fills in R.rectot the valu
}
}
+/**
+ * Fill the z buffer. The face buffer is not operated on!
+ *
+ * This is one of the z buffer fill functions called in zbufclip() and
+ * zbufwireclip().
+ *
+ * @param v1 [4 floats, world coordinates] first vertex
+ * @param v2 [4 floats, world coordinates] second vertex
+ * @param v3 [4 floats, world coordinates] third vertex
+ */
-void zbufinvulGL_onlyZ(float *v1, float *v2, float *v3) /* only fills in R.rectz */
+static void zbufinvulGL_onlyZ(unsigned int zvlnr, float *v1, float *v2, float *v3)
{
double x0,y0,z0,x1,y1,z1,x2,y2,z2,xx1;
double zxd,zyd,zy0,tmp;
@@ -1469,65 +1611,27 @@ void zbufinvulGL_onlyZ(float *v1, float *v2, float *v3) /* only fills in R.rec
}
}
-void print3floats(float *v1, float *v2, float *v3)
-{
- printf("1 %f %f %f %f\n", v1[0], v1[1], v1[2], v1[3]);
- printf("2 %f %f %f %f\n", v2[0], v2[1], v2[2], v2[3]);
- printf("3 %f %f %f %f\n", v3[0], v3[1], v3[2], v3[3]);
-}
-
-static short cliptestf(float p, float q, float *u1, float *u2)
-{
- float r;
-
- if(p<0.0) {
- if(q<p) return 0;
- else if(q<0.0) {
- r= q/p;
- if(r>*u2) return 0;
- else if(r>*u1) *u1=r;
- }
- }
- else {
- if(p>0.0) {
- if(q<0.0) return 0;
- else if(q<p) {
- r= q/p;
- if(r<*u1) return 0;
- else if(r<*u2) *u2=r;
- }
- }
- else if(q<0.0) return 0;
- }
- return 1;
-}
-
-int RE_testclip(float *v)
-{
- float abs4; /* WATCH IT: this function should do the same as cliptestf, otherwise troubles in zbufclip()*/
- short c=0;
-
- abs4= fabs(v[3]);
-
- if(v[2]< -abs4) c=16; /* this used to be " if(v[2]<0) ", see clippz() */
- else if(v[2]> abs4) c+= 32;
-
- if( v[0]>abs4) c+=2;
- else if( v[0]< -abs4) c+=1;
-
- if( v[1]>abs4) c+=4;
- else if( v[1]< -abs4) c+=8;
-
- return c;
-}
+/**
+ * (clip pyramid)
+ * Sets labda: flag, and parametrize the clipping of vertices in
+ * viewspace coordinates. labda = -1 means no clipping, labda in [0,
+ * 1] means a clipping.
+ * Note: uses globals.
+ * @param v1 start coordinate s
+ * @param v2 target coordinate t
+ * @param b1
+ * @param b2
+ * @param b3
+ * @param a index for coordinate (x, y, or z)
+ */
-static void clipp(float *v1, float *v2, int b1, int *b2, int *b3, int a)
+static void clippyra(float *labda, float *v1, float *v2, int *b2, int *b3, int a)
{
float da,db,u1=0.0,u2=1.0;
- labda[b1][0]= -1.0;
- labda[b1][1]= -1.0;
+ labda[0]= -1.0;
+ labda[1]= -1.0;
da= v2[a]-v1[a];
db= v2[3]-v1[3];
@@ -1543,92 +1647,58 @@ static void clipp(float *v1, float *v2, int b1, int *b2, int *b3, int a)
if(cliptestf(da-db, v1[3]-v1[a], &u1,&u2)) {
*b3=1;
if(u2<1.0) {
- labda[b1][1]= u2;
+ labda[1]= u2;
*b2=1;
}
- else labda[b1][1]=1.0; /* u2 */
+ else labda[1]=1.0; /* u2 */
if(u1>0.0) {
- labda[b1][0]= u1;
+ labda[0]= u1;
*b2=1;
- } else labda[b1][0]=0.0;
+ } else labda[0]=0.0;
}
}
}
-static int clipline(float *v1, float *v2) /* return 0: do not draw */
-{
- float dz,dw, u1=0.0, u2=1.0;
- float dx, dy, v13;
-
- dz= v2[2]-v1[2];
- dw= v2[3]-v1[3];
-
- /* this 1.01 is for clipping x and y just a tinsy larger. that way it is
- filled in with zbufwire correctly when rendering in parts. otherwise
- you see line endings at edges... */
-
- if(cliptestf(-dz-dw, v1[3]+v1[2], &u1,&u2)) {
- if(cliptestf(dz-dw, v1[3]-v1[2], &u1,&u2)) {
-
- dx= v2[0]-v1[0];
- dz= 1.01*(v2[3]-v1[3]);
- v13= 1.01*v1[3];
-
- if(cliptestf(-dx-dz, v1[0]+v13, &u1,&u2)) {
- if(cliptestf(dx-dz, v13-v1[0], &u1,&u2)) {
-
- dy= v2[1]-v1[1];
-
- if(cliptestf(-dy-dz, v1[1]+v13, &u1,&u2)) {
- if(cliptestf(dy-dz, v13-v1[1], &u1,&u2)) {
-
- if(u2<1.0) {
- v2[0]= v1[0]+u2*dx;
- v2[1]= v1[1]+u2*dy;
- v2[2]= v1[2]+u2*dz;
- v2[3]= v1[3]+u2*dw;
- }
- if(u1>0.0) {
- v1[0]= v1[0]+u1*dx;
- v1[1]= v1[1]+u1*dy;
- v1[2]= v1[2]+u1*dz;
- v1[3]= v1[3]+u1*dw;
- }
- return 1;
- }
- }
- }
- }
- }
- }
-
- return 0;
-}
-
+/**
+ * (make vertex pyramide clip)
+ * Checks labda and uses this to make decision about clipping the line
+ * segment from v1 to v2. labda is the factor by which the vector is
+ * cut. ( calculate s + l * ( t - s )). The result is appended to the
+ * vertex list of this face.
+ *
+ *
+ * @param v1 start coordinate s
+ * @param v2 target coordinate t
+ * @param b1
+ * @param b2
+ * @param clve vertex vector.
+ */
-static void maakvertpira(float *v1, float *v2, int *b1, int b2, int *clve)
+static void makevertpyra(float *vez, float *labda, float **trias, float *v1, float *v2, int *b1, int *clve)
{
- float l1,l2,*adr;
+ float l1, l2, *adr;
- l1= labda[b2][0];
- l2= labda[b2][1];
+ l1= labda[0];
+ l2= labda[1];
if(l1!= -1.0) {
if(l1!= 0.0) {
adr= vez+4*(*clve);
- p[*b1]=adr;
+ trias[*b1]=adr;
(*clve)++;
adr[0]= v1[0]+l1*(v2[0]-v1[0]);
adr[1]= v1[1]+l1*(v2[1]-v1[1]);
adr[2]= v1[2]+l1*(v2[2]-v1[2]);
adr[3]= v1[3]+l1*(v2[3]-v1[3]);
- } else p[*b1]= v1;
+ }
+ else trias[*b1]= v1;
+
(*b1)++;
}
if(l2!= -1.0) {
if(l2!= 1.0) {
adr= vez+4*(*clve);
- p[*b1]=adr;
+ trias[*b1]=adr;
(*clve)++;
adr[0]= v1[0]+l2*(v2[0]-v1[0]);
adr[1]= v1[1]+l2*(v2[1]-v1[1]);
@@ -1672,10 +1742,13 @@ void projectvert(float *v1, float *adr)
adr[3]= x*R.winmat[0][3]+ y*R.winmat[1][3]+ z*R.winmat[2][3]+ R.winmat[3][3];
}
+/* do zbuffering and clip, f1 f2 f3 are hocos, c1 c2 c3 are clipping flags */
-void zbufclip(float *f1, float *f2, float *f3, int c1, int c2, int c3)
+void zbufclip(unsigned int zvlnr, float *f1, float *f2, float *f3, int c1, int c2, int c3)
{
float deler;
+ float *vlzp[32][3], labda[3][2];
+ float vez[400], *trias[40];
if(c1 | c2 | c3) { /* not in middle */
if(c1 & c2 & c3) { /* completely out */
@@ -1712,9 +1785,9 @@ void zbufclip(float *f1, float *f2, float *f3, int c1, int c2, int c3)
else if (b==1) arg= 0;
else arg= 1;
- clipp(vlzp[v][0],vlzp[v][1],0,&b2,&b3, arg);
- clipp(vlzp[v][1],vlzp[v][2],1,&b2,&b3, arg);
- clipp(vlzp[v][2],vlzp[v][0],2,&b2,&b3, arg);
+ clippyra(labda[0], vlzp[v][0],vlzp[v][1], &b2,&b3, arg);
+ clippyra(labda[1], vlzp[v][1],vlzp[v][2], &b2,&b3, arg);
+ clippyra(labda[2], vlzp[v][2],vlzp[v][0], &b2,&b3, arg);
if(b2==0 && b3==1) {
/* completely 'in' */;
@@ -1723,9 +1796,9 @@ void zbufclip(float *f1, float *f2, float *f3, int c1, int c2, int c3)
/* completely 'out' */;
} else {
b1=0;
- maakvertpira(vlzp[v][0],vlzp[v][1],&b1,0,&clve);
- maakvertpira(vlzp[v][1],vlzp[v][2],&b1,1,&clve);
- maakvertpira(vlzp[v][2],vlzp[v][0],&b1,2,&clve);
+ makevertpyra(vez, labda[0], trias, vlzp[v][0],vlzp[v][1], &b1,&clve);
+ makevertpyra(vez, labda[1], trias, vlzp[v][1],vlzp[v][2], &b1,&clve);
+ makevertpyra(vez, labda[2], trias, vlzp[v][2],vlzp[v][0], &b1,&clve);
/* after front clip done: now set clip flags */
if(b==0) {
@@ -1742,9 +1815,9 @@ void zbufclip(float *f1, float *f2, float *f3, int c1, int c2, int c3)
vlzp[v][0]=0;
if(b1>2) {
for(b3=3; b3<=b1; b3++) {
- vlzp[clvl][0]= p[0];
- vlzp[clvl][1]= p[b3-2];
- vlzp[clvl][2]= p[b3-1];
+ vlzp[clvl][0]= trias[0];
+ vlzp[clvl][1]= trias[b3-2];
+ vlzp[clvl][2]= trias[b3-1];
clvl++;
}
}
@@ -1768,7 +1841,7 @@ void zbufclip(float *f1, float *f2, float *f3, int c1, int c2, int c3)
}
for(b=1;b<clvl;b++) {
if(vlzp[b][0]) {
- zbuffunc(vlzp[b][0],vlzp[b][1],vlzp[b][2]);
+ zbuffunc(zvlnr, vlzp[b][0],vlzp[b][1],vlzp[b][2]);
}
}
return;
@@ -1792,7 +1865,7 @@ void zbufclip(float *f1, float *f2, float *f3, int c1, int c2, int c3)
vez[9]= Zmuly*(1.0+f3[1]/deler)+ Zjity;
vez[10]= 0x7FFFFFFF *(f3[2]/deler);
- zbuffunc(vez,vez+4,vez+8);
+ zbuffunc(zvlnr, vez,vez+4,vez+8);
}
/* ***************** ZBUFFER MAIN ROUTINES **************** */
@@ -1802,7 +1875,7 @@ void zbufferall(void)
{
VlakRen *vlr= NULL;
Material *ma=0;
- int v;
+ unsigned int v, zvlnr;
short transp=0, env=0, wire=0;
Zmulx= ((float)R.rectx)/2.0;
@@ -1810,8 +1883,6 @@ void zbufferall(void)
fillrect(R.rectz, R.rectx, R.recty, 0x7FFFFFFF);
- Zvlnr= 0;
-
zbuffunc= zbufinvulGL;
zbuflinefunc= zbufline;
@@ -1832,15 +1903,15 @@ void zbufferall(void)
}
if(transp==0) {
- if(env) Zvlnr= 0;
- else Zvlnr= v+1;
+ if(env) zvlnr= 0;
+ else zvlnr= v+1;
- if(wire) zbufclipwire(vlr);
+ if(wire) zbufclipwire(zvlnr, vlr);
else {
- zbufclip(vlr->v1->ho, vlr->v2->ho, vlr->v3->ho, vlr->v1->clip, vlr->v2->clip, vlr->v3->clip);
+ zbufclip(zvlnr, vlr->v1->ho, vlr->v2->ho, vlr->v3->ho, vlr->v1->clip, vlr->v2->clip, vlr->v3->clip);
if(vlr->v4) {
- if(Zvlnr) Zvlnr+= 0x800000;
- zbufclip(vlr->v1->ho, vlr->v3->ho, vlr->v4->ho, vlr->v1->clip, vlr->v3->clip, vlr->v4->clip);
+ if(zvlnr) zvlnr+= 0x800000;
+ zbufclip(zvlnr, vlr->v1->ho, vlr->v3->ho, vlr->v4->ho, vlr->v1->clip, vlr->v3->clip, vlr->v4->clip);
}
}
}
@@ -1859,14 +1930,14 @@ static int hashlist_projectvert(float *v1, float *hoco)
buck= &bucket[ (((long)v1)/16) & 255 ];
if(buck->vert==v1) {
- COPY_16(hoco, buck->hoco);
+ QUATCOPY(hoco, buck->hoco);
return buck->clip;
}
projectvert(v1, hoco);
buck->clip = RE_testclip(hoco);
buck->vert= v1;
- COPY_16(buck->hoco, hoco);
+ QUATCOPY(buck->hoco, hoco);
return buck->clip;
}
@@ -1874,7 +1945,7 @@ static int hashlist_projectvert(float *v1, float *hoco)
void RE_zbufferall_radio(struct RadView *vw, RNode **rg_elem, int rg_totelem)
{
float hoco[4][4];
- int a;
+ unsigned int a, zvlnr;
int c1, c2, c3, c4= 0;
unsigned int *rectoto, *rectzo;
int rectxo, rectyo;
@@ -1913,9 +1984,9 @@ void RE_zbufferall_radio(struct RadView *vw, RNode **rg_elem, int rg_totelem)
rn= *re;
if( (rn->f & RAD_SHOOT)==0 ) { /* no shootelement */
- if( rn->f & RAD_TWOSIDED) Zvlnr= a;
- else if( rn->f & RAD_BACKFACE) Zvlnr= 0xFFFFFF;
- else Zvlnr= a;
+ if( rn->f & RAD_TWOSIDED) zvlnr= a;
+ else if( rn->f & RAD_BACKFACE) zvlnr= 0xFFFFFF;
+ else zvlnr= a;
c1= hashlist_projectvert(rn->v1, hoco[0]);
c2= hashlist_projectvert(rn->v2, hoco[1]);
@@ -1925,9 +1996,9 @@ void RE_zbufferall_radio(struct RadView *vw, RNode **rg_elem, int rg_totelem)
c4= hashlist_projectvert(rn->v4, hoco[3]);
}
- zbufclip(hoco[0], hoco[1], hoco[2], c1, c2, c3);
+ zbufclip(zvlnr, hoco[0], hoco[1], hoco[2], c1, c2, c3);
if(rn->v4) {
- zbufclip(hoco[0], hoco[2], hoco[3], c1, c3, c4);
+ zbufclip(zvlnr, hoco[0], hoco[2], hoco[3], c1, c3, c4);
}
}
}
@@ -1944,9 +2015,9 @@ void RE_zbufferall_radio(struct RadView *vw, RNode **rg_elem, int rg_totelem)
rf= vlr->radface;
if( (rf->flag & RAD_SHOOT)==0 ) { /* no shootelement */
- if( rf->flag & RAD_TWOSIDED) Zvlnr= totface;
- else if( rf->flag & RAD_BACKFACE) Zvlnr= 0xFFFFFF; /* receives no energy, but is zbuffered */
- else Zvlnr= totface;
+ if( rf->flag & RAD_TWOSIDED) zvlnr= totface;
+ else if( rf->flag & RAD_BACKFACE) zvlnr= 0xFFFFFF; /* receives no energy, but is zbuffered */
+ else zvlnr= totface;
c1= hashlist_projectvert(vlr->v1->co, hoco[0]);
c2= hashlist_projectvert(vlr->v2->co, hoco[1]);
@@ -1956,9 +2027,9 @@ void RE_zbufferall_radio(struct RadView *vw, RNode **rg_elem, int rg_totelem)
c4= hashlist_projectvert(vlr->v4->co, hoco[3]);
}
- zbufclip(hoco[0], hoco[1], hoco[2], c1, c2, c3);
+ zbufclip(zvlnr, hoco[0], hoco[1], hoco[2], c1, c2, c3);
if(vlr->v4) {
- zbufclip(hoco[0], hoco[2], hoco[3], c1, c3, c4);
+ zbufclip(zvlnr, hoco[0], hoco[2], hoco[3], c1, c3, c4);
}
}
totface++;
@@ -2002,8 +2073,8 @@ void zbuffershad(LampRen *lar)
}
if(ok && (vlr->flag & R_VISIBLE) && (vlr->lay & lay)) {
- zbufclip(vlr->v1->ho, vlr->v2->ho, vlr->v3->ho, vlr->v1->clip, vlr->v2->clip, vlr->v3->clip);
- if(vlr->v4) zbufclip(vlr->v1->ho, vlr->v3->ho, vlr->v4->ho, vlr->v1->clip, vlr->v3->clip, vlr->v4->clip);
+ zbufclip(0, vlr->v1->ho, vlr->v2->ho, vlr->v3->ho, vlr->v1->clip, vlr->v2->clip, vlr->v3->clip);
+ if(vlr->v4) zbufclip(0, vlr->v1->ho, vlr->v3->ho, vlr->v4->ho, vlr->v1->clip, vlr->v3->clip, vlr->v4->clip);
}
}
}
@@ -2016,7 +2087,6 @@ void zbuffershad(LampRen *lar)
void bgnaccumbuf(void)
{
- Acolrow= MEM_mallocN(4*sizeof(short)*R.rectx, "Acolrow");
Arectz= MEM_mallocN(sizeof(int)*ABUFPART*R.rectx, "Arectz");
APixbuf= MEM_mallocN(ABUFPART*R.rectx*sizeof(APixstr), "APixbuf");
@@ -2032,7 +2102,6 @@ void bgnaccumbuf(void)
void endaccumbuf(void)
{
- MEM_freeN(Acolrow);
MEM_freeN(Arectz);
MEM_freeN(APixbuf);
freepsA();
@@ -2040,7 +2109,11 @@ void endaccumbuf(void)
/* ------------------------------------------------------------------------ */
-void copyto_abufz(int sample)
+/**
+ * Copy results from the solid face z buffering to the transparent
+ * buffer.
+ */
+static void copyto_abufz(int sample)
{
PixStr *ps;
int x, y, *rza;
@@ -2078,11 +2151,16 @@ void copyto_abufz(int sample)
/* ------------------------------------------------------------------------ */
-void zbuffer_abuf()
+/**
+* Do accumulation z buffering.
+ */
+static void zbuffer_abuf()
{
- float vec[3], hoco[4], mul, zval, fval;
Material *ma=0;
- int v, len;
+ VlakRen *vlr=NULL;
+ float vec[3], hoco[4], mul, zval, fval;
+ unsigned int v, zvlnr;
+ int len;
Zjitx= Zjity= -0.5;
Zmulx= ((float)R.rectx)/2.0;
@@ -2106,20 +2184,20 @@ void zbuffer_abuf()
for(v=0; v<R.totvlak; v++) {
if((v & 255)==0) {
- Zvlr= R.blovl[v>>8];
+ vlr= R.blovl[v>>8];
}
- else Zvlr++;
+ else vlr++;
- ma= Zvlr->mat;
+ ma= vlr->mat;
if(ma->mode & (MA_ZTRA)) {
/* a little advantage for transp rendering (a z offset) */
if( ma->zoffs != 0.0) {
mul= 0x7FFFFFFF;
- zval= mul*(1.0+Zvlr->v1->ho[2]/Zvlr->v1->ho[3]);
+ zval= mul*(1.0+vlr->v1->ho[2]/vlr->v1->ho[3]);
- VECCOPY(vec, Zvlr->v1->co);
+ VECCOPY(vec, vlr->v1->co);
/* z is negative, otherwise its being clipped */
vec[2]-= ma->zoffs;
RE_projectverto(vec, hoco);
@@ -2129,16 +2207,16 @@ void zbuffer_abuf()
}
else Azvoordeel= 0;
- Zvlnr= v+1;
+ zvlnr= v+1;
- if(Zvlr->flag & R_VISIBLE) {
+ if(vlr->flag & R_VISIBLE) {
- if(ma->mode & (MA_WIRE)) zbufclipwire(Zvlr);
+ if(ma->mode & (MA_WIRE)) zbufclipwire(zvlnr, vlr);
else {
- zbufclip(Zvlr->v1->ho, Zvlr->v2->ho, Zvlr->v3->ho, Zvlr->v1->clip, Zvlr->v2->clip, Zvlr->v3->clip);
- if(Zvlr->v4) {
- Zvlnr+= 0x800000;
- zbufclip(Zvlr->v1->ho, Zvlr->v3->ho, Zvlr->v4->ho, Zvlr->v1->clip, Zvlr->v3->clip, Zvlr->v4->clip);
+ zbufclip(zvlnr, vlr->v1->ho, vlr->v2->ho, vlr->v3->ho, vlr->v1->clip, vlr->v2->clip, vlr->v3->clip);
+ if(vlr->v4) {
+ zvlnr+= 0x800000;
+ zbufclip(zvlnr, vlr->v1->ho, vlr->v3->ho, vlr->v4->ho, vlr->v1->clip, vlr->v3->clip, vlr->v4->clip);
}
}
}
@@ -2161,7 +2239,10 @@ int vergzvlak(const void *a1, const void *a2)
return 0;
}
-void shadetrapixel(float x, float y, int face, int mask, unsigned short *shortcol)
+/**
+* Shade this face at this location in SCS.
+ */
+static void shadetrapixel(float x, float y, int face, int mask, float *fcol)
{
if( (face & 0x7FFFFF) > R.totvlak) {
@@ -2170,44 +2251,64 @@ void shadetrapixel(float x, float y, int face, int mask, unsigned short *shortco
}
if(R.r.mode & R_OSA) {
VlakRen *vlr= RE_findOrAddVlak( (face-1) & 0x7FFFFF);
- int intcol[4]={0,0,0,0};
- int a, tot=0;
+ float accumcol[4]={0,0,0,0}, tot=0.0;
+ int a;
if(vlr->flag & R_FULL_OSA) {
for(a=0; a<R.osa; a++) {
if(mask & (1<<a)) {
- shadepixel_short(x+jit[a][0], y+jit[a][1], face, 1<<a, shortcol);
- intcol[0]+= shortcol[0];
- intcol[1]+= shortcol[1];
- intcol[2]+= shortcol[2];
- intcol[3]+= shortcol[3];
- tot++;
+ shadepixel(x+jit[a][0], y+jit[a][1], face, 1<<a, fcol);
+ accumcol[0]+= fcol[0];
+ accumcol[1]+= fcol[1];
+ accumcol[2]+= fcol[2];
+ accumcol[3]+= fcol[3];
+ tot+= 1.0;
}
}
- shortcol[0]= intcol[0]/tot;
- shortcol[1]= intcol[1]/tot;
- shortcol[2]= intcol[2]/tot;
- shortcol[3]= intcol[3]/tot;
+ tot= 1.0/tot;
+ fcol[0]= accumcol[0]*tot;
+ fcol[1]= accumcol[1]*tot;
+ fcol[2]= accumcol[2]*tot;
+ fcol[3]= accumcol[3]*tot;
}
else {
+ extern float centLut[16];
+ extern char *centmask;
+
int b= centmask[mask];
x= x+centLut[b & 15];
y= y+centLut[b>>4];
- shadepixel_short(x, y, face, mask, shortcol);
+ shadepixel(x, y, face, mask, fcol);
}
}
- else shadepixel_short(x, y, face, mask, shortcol);
+ else shadepixel(x, y, face, mask, fcol);
}
-extern unsigned short usegamtab;
-void abufsetrow(int y)
+static int addtosampcol(float *sampcol, float *fcol, int mask)
{
+ int a, retval = R.osa;
+
+ for(a=0; a < R.osa; a++) {
+ if(mask & (1<<a)) addAlphaUnderFloat(sampcol, fcol);
+ if(sampcol[3]>0.999) retval--;
+ sampcol+= 4;
+ }
+ return retval;
+}
+
+/*
+ * renders when needed the Abuffer with faces stored in pixels, returns 1 scanline rendered
+ */
+
+void abufsetrow(float *acolrow, int y)
+{
+ extern SDL_mutex *render_abuf_lock; // initrender.c
APixstr *ap, *apn;
- float ys;
- int x, part, a, zrow[100][3], totvlak, alpha[32], tempgam, nr, intcol[4];
- int sval, tempRf;
- unsigned short *col, shortcol[4], tempcol[4], sampcol[16*4], *scol;
+ float *col, fcol[4], tempcol[4], sampcol[16*4], *scol, accumcol[4];
+ float ys, fac, alpha[32];
+ int x, part, a, zrow[100][3], totvlak, nr;
+ int sval;
if(y<0) return;
if(R.osa>16) {
@@ -2216,16 +2317,24 @@ void abufsetrow(int y)
return;
}
- tempRf= R.flag;
- R.flag &= ~R_LAMPHALO;
+ //R.flag &= ~R_LAMPHALO;
/* alpha LUT */
if(R.r.mode & R_OSA ) {
- x= (65536/R.osa);
+ fac= (1.0/(float)R.osa);
for(a=0; a<=R.osa; a++) {
- alpha[a]= a*x;
+ alpha[a]= (float)a*fac;
}
}
+
+ if(R.r.mode & R_THREADS) {
+ /* lock thread if... */
+ if(y>Aminy+2 && y<Amaxy-2);
+ else {
+ if(render_abuf_lock) SDL_mutexP(render_abuf_lock);
+ }
+ }
+
/* does a pixbuf has to be created? */
if(y<Aminy || y>Amaxy) {
part= (y/ABUFPART);
@@ -2237,12 +2346,10 @@ void abufsetrow(int y)
}
/* render row */
- col= Acolrow;
- memset(col, 0, 2*4*R.rectx);
- ap= APixbuf+R.rectx*(y-Aminy);
+ col= acolrow;
+ memset(col, 0, 4*sizeof(float)*R.rectx);
+ ap= APixbuf + R.rectx*(y-Aminy);
ys= y;
- tempgam= usegamtab;
- usegamtab= 0;
for(x=0; x<R.rectx; x++, col+=4, ap++) {
if(ap->p[0]) {
@@ -2264,21 +2371,21 @@ void abufsetrow(int y)
}
if(totvlak==1) {
- shadetrapixel((float)x, (float)y, ap->p[0], ap->mask[0], shortcol);
+ shadetrapixel((float)x, (float)y, ap->p[0], ap->mask[0], fcol);
nr= count_mask(ap->mask[0]);
if( (R.r.mode & R_OSA) && nr<R.osa) {
- a= alpha[ nr ];
- col[0]= (shortcol[0]*a)>>16;
- col[1]= (shortcol[1]*a)>>16;
- col[2]= (shortcol[2]*a)>>16;
- col[3]= (shortcol[3]*a)>>16;
+ fac= alpha[ nr ];
+ col[0]= (fcol[0]*fac);
+ col[1]= (fcol[1]*fac);
+ col[2]= (fcol[2]*fac);
+ col[3]= (fcol[3]*fac);
}
else {
- col[0]= shortcol[0];
- col[1]= shortcol[1];
- col[2]= shortcol[2];
- col[3]= shortcol[3];
+ col[0]= fcol[0];
+ col[1]= fcol[1];
+ col[2]= fcol[2];
+ col[3]= fcol[3];
}
}
else {
@@ -2300,13 +2407,13 @@ void abufsetrow(int y)
while(totvlak>0) {
totvlak--;
- shadetrapixel((float)x, (float)y, zrow[totvlak][1], zrow[totvlak][2], shortcol);
+ shadetrapixel((float)x, (float)y, zrow[totvlak][1], zrow[totvlak][2], fcol);
a= count_mask(zrow[totvlak][2]);
if( (R.r.mode & R_OSA ) && a<R.osa) {
if(totvlak>0) {
- memset(sampcol, 0, 4*2*R.osa);
- sval= addtosampcol(sampcol, shortcol, zrow[totvlak][2]);
+ memset(sampcol, 0, 4*sizeof(float)*R.osa);
+ sval= addtosampcol(sampcol, fcol, zrow[totvlak][2]);
/* sval==0: alpha completely full */
while( (sval != 0) && (totvlak>0) ) {
@@ -2314,44 +2421,48 @@ void abufsetrow(int y)
if(a==R.osa) break;
totvlak--;
- shadetrapixel((float)x, (float)y, zrow[totvlak][1], zrow[totvlak][2], shortcol);
- sval= addtosampcol(sampcol, shortcol, zrow[totvlak][2]);
+ shadetrapixel((float)x, (float)y, zrow[totvlak][1], zrow[totvlak][2], fcol);
+ sval= addtosampcol(sampcol, fcol, zrow[totvlak][2]);
}
scol= sampcol;
- intcol[0]= scol[0]; intcol[1]= scol[1];
- intcol[2]= scol[2]; intcol[3]= scol[3];
+ accumcol[0]= scol[0]; accumcol[1]= scol[1];
+ accumcol[2]= scol[2]; accumcol[3]= scol[3];
scol+= 4;
for(a=1; a<R.osa; a++, scol+=4) {
- intcol[0]+= scol[0]; intcol[1]+= scol[1];
- intcol[2]+= scol[2]; intcol[3]+= scol[3];
+ accumcol[0]+= scol[0]; accumcol[1]+= scol[1];
+ accumcol[2]+= scol[2]; accumcol[3]+= scol[3];
}
- tempcol[0]= intcol[0]/R.osa;
- tempcol[1]= intcol[1]/R.osa;
- tempcol[2]= intcol[2]/R.osa;
- tempcol[3]= intcol[3]/R.osa;
+ tempcol[0]= accumcol[0]/R.osa;
+ tempcol[1]= accumcol[1]/R.osa;
+ tempcol[2]= accumcol[2]/R.osa;
+ tempcol[3]= accumcol[3]/R.osa;
- addAlphaUnderShort(col, tempcol);
+ addAlphaUnderFloat(col, tempcol);
}
else {
- a= alpha[a];
- shortcol[0]= (shortcol[0]*a)>>16;
- shortcol[1]= (shortcol[1]*a)>>16;
- shortcol[2]= (shortcol[2]*a)>>16;
- shortcol[3]= (shortcol[3]*a)>>16;
- addAlphaUnderShort(col, shortcol);
+ fac= alpha[a];
+ fcol[0]= (fcol[0]*fac);
+ fcol[1]= (fcol[1]*fac);
+ fcol[2]= (fcol[2]*fac);
+ fcol[3]= (fcol[3]*fac);
+ addAlphaUnderFloat(col, fcol);
}
}
- else addAlphaUnderShort(col, shortcol);
+ else addAlphaUnderFloat(col, fcol);
- if(col[3]>=0xFFF0) break;
+ if(col[3]>=0.999) break;
}
}
}
}
- usegamtab= tempgam;
- R.flag= tempRf;
+ if(R.r.mode & R_THREADS) {
+ if(y>Aminy+2 && y<Amaxy-2);
+ else {
+ if(render_abuf_lock) SDL_mutexV(render_abuf_lock);
+ }
+ }
}
/* end of zbuf.c */
diff --git a/source/blender/render/intern/source/zbufferdatastruct.c b/source/blender/render/intern/source/zbufferdatastruct.c
index 78a5d29487e..319393290bd 100644
--- a/source/blender/render/intern/source/zbufferdatastruct.c
+++ b/source/blender/render/intern/source/zbufferdatastruct.c
@@ -62,7 +62,6 @@
#include "MEM_guardedalloc.h"
#include "zbufferdatastruct.h"
#include "render.h"
-#include "render_intern.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -185,6 +184,11 @@ void insertObject(int apteller,
RE_APixstrExt* apn = &APixbufExt[apteller];
int all_subpixels= 0;
+ //if(obtype==RE_POLY) {
+ // VlakRen *vlr= RE_findOrAddVlak( (obindex-1) & 0x7FFFFF);
+ // if(vlr->flag & R_FULL_OSA) all_subpixels= 1;
+ //}
+
while(apn) {
if(apn->t[0] == RE_NONE) {
apn->p[0] = obindex; apn->t[0] = obtype;
diff --git a/source/blender/renderconverter/RE_renderconverter.h b/source/blender/renderconverter/RE_renderconverter.h
index 450a4f7c764..272248f7066 100644
--- a/source/blender/renderconverter/RE_renderconverter.h
+++ b/source/blender/renderconverter/RE_renderconverter.h
@@ -86,7 +86,12 @@ extern "C" {
void RE_make_stars(void (*initfunc)(void),
void (*vertexfunc)(float*),
void (*termfunc)(void));
-
+
+ /**
+ * called by meshtools
+ */
+ void RE_make_sticky(void);
+
#ifdef __cplusplus
}
diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c
index f7aa95b99dc..0108603e103 100644
--- a/source/blender/renderconverter/intern/convertBlenderScene.c
+++ b/source/blender/renderconverter/intern/convertBlenderScene.c
@@ -798,7 +798,7 @@ static void make_render_halos(Object *ob, Mesh *me, int totvert, MVert *mvert, M
HaloRen *har;
float xn, yn, zn, nor[3], view[3];
float *orco, vec[3], hasize, mat[4][4], imat[3][3];
- int start, end, a, ok;
+ int start, end, a, ok, seed= ma->seed1;
MTC_Mat4MulMat4(mat, ob->obmat, R.viewmat);
MTC_Mat3CpyMat4(imat, ob->imat);
@@ -813,8 +813,6 @@ static void make_render_halos(Object *ob, Mesh *me, int totvert, MVert *mvert, M
mvert+= start;
if(extverts) extverts+= 3*start;
- ma->ren->seed1= ma->seed1;
-
for(a=start; a<end; a++, mvert++) {
ok= 1;
@@ -849,12 +847,12 @@ static void make_render_halos(Object *ob, Mesh *me, int totvert, MVert *mvert, M
else hasize*= zn*zn*zn*zn;
}
- if(orco) har= RE_inithalo(ma, vec, 0, orco, hasize, 0);
- else har= RE_inithalo(ma, vec, 0, mvert->co, hasize, 0);
+ if(orco) har= RE_inithalo(ma, vec, 0, orco, hasize, 0, seed);
+ else har= RE_inithalo(ma, vec, 0, mvert->co, hasize, 0, seed);
if(har) har->lay= ob->lay;
}
if(orco) orco+= 3;
- ma->ren->seed1++;
+ seed++;
}
}
@@ -867,7 +865,7 @@ static void render_particle_system(Object *ob, PartEff *paf)
HaloRen *har=0;
Material *ma=0;
float xn, yn, zn, imat[3][3], mat[4][4], hasize, ptime, ctime, vec[3], vec1[3], view[3], nor[3];
- int a, mat_nr=1;
+ int a, mat_nr=1, seed;
pa= paf->keys;
if(pa==NULL) {
@@ -877,7 +875,6 @@ static void render_particle_system(Object *ob, PartEff *paf)
}
ma= give_render_material(ob, 1);
- if(ma==NULL) ma= &defmaterial;
MTC_Mat4MulMat4(mat, ob->obmat, R.viewmat);
MTC_Mat4Invert(ob->imat, mat); /* this is correct, for imat texture */
@@ -890,7 +887,7 @@ static void render_particle_system(Object *ob, PartEff *paf)
if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= ob->sf;
else ptime= 0.0;
ctime= bsystem_time(ob, 0, (float)G.scene->r.cfra, ptime);
- ma->ren->seed1= ma->seed1;
+ seed= ma->seed1;
for(a=0; a<paf->totpart; a++, pa+=paf->totkey) {
@@ -912,7 +909,6 @@ static void render_particle_system(Object *ob, PartEff *paf)
if(pa->mat_nr != mat_nr) {
mat_nr= pa->mat_nr;
ma= give_render_material(ob, mat_nr);
- if(ma==0) ma= &defmaterial;
}
if(ma->ipo) {
@@ -943,9 +939,9 @@ static void render_particle_system(Object *ob, PartEff *paf)
else hasize*= zn*zn*zn*zn;
}
- if(paf->stype==PAF_VECT) har= RE_inithalo(ma, vec, vec1, pa->co, hasize, paf->vectsize);
+ if(paf->stype==PAF_VECT) har= RE_inithalo(ma, vec, vec1, pa->co, hasize, paf->vectsize, seed);
else {
- har= RE_inithalo(ma, vec, 0, pa->co, hasize, 0);
+ har= RE_inithalo(ma, vec, 0, pa->co, hasize, 0, seed);
if(har && ma->mode & MA_HALO_SHADE) {
VecSubf(har->no, vec, vec1);
Normalise(har->no);
@@ -954,7 +950,7 @@ static void render_particle_system(Object *ob, PartEff *paf)
if(har) har->lay= ob->lay;
}
}
- ma->ren->seed1++;
+ seed++;
}
/* restore material */
@@ -977,7 +973,7 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
VlakRen *vlr;
float xn, yn, zn, imat[3][3], mat[4][4], hasize;
float mtime, ptime, ctime, vec[3], vec1[3], view[3], nor[3];
- int a, mat_nr=1;
+ int a, mat_nr=1, seed;
pa= paf->keys;
if(pa==NULL || (paf->flag & PAF_ANIMATED)) {
@@ -987,7 +983,6 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
}
ma= give_render_material(ob, 1);
- if(ma==NULL) ma= &defmaterial;
MTC_Mat4MulMat4(mat, ob->obmat, R.viewmat);
MTC_Mat4Invert(ob->imat, mat); /* need to be that way, for imat texture */
@@ -999,7 +994,7 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= ob->sf;
else ptime= 0.0;
ctime= bsystem_time(ob, 0, (float)G.scene->r.cfra, ptime);
- ma->ren->seed1= ma->seed1;
+ seed= ma->seed1;
for(a=0; a<paf->totpart; a++, pa+=paf->totkey) {
@@ -1026,7 +1021,6 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
if(pa->mat_nr != mat_nr) {
mat_nr= pa->mat_nr;
ma= give_render_material(ob, mat_nr);
- if(ma==0) ma= &defmaterial;
}
if(ma->mode & MA_WIRE) {
@@ -1085,9 +1079,9 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
else hasize*= zn*zn*zn*zn;
}
- if(paf->stype==PAF_VECT) har= RE_inithalo(ma, vec, vec1, pa->co, hasize, paf->vectsize);
+ if(paf->stype==PAF_VECT) har= RE_inithalo(ma, vec, vec1, pa->co, hasize, paf->vectsize, seed);
else {
- har= RE_inithalo(ma, vec, 0, pa->co, hasize, 0);
+ har= RE_inithalo(ma, vec, 0, pa->co, hasize, 0, seed);
if(har && (ma->mode & MA_HALO_SHADE)) {
VecSubf(har->no, vec, vec1);
Normalise(har->no);
@@ -1099,7 +1093,7 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
VECCOPY(vec1, vec);
}
- ma->ren->seed1++;
+ seed++;
}
}
@@ -1167,7 +1161,9 @@ static void sort_halos(void)
static Material *give_render_material(Object *ob, int nr)
{
+ extern Material defmaterial; // initrender.c
Object *temp;
+ Material *ma;
if(ob->flag & OB_FROMDUPLI) {
temp= (Object *)ob->id.newid;
@@ -1176,7 +1172,10 @@ static Material *give_render_material(Object *ob, int nr)
}
}
- return give_current_material(ob, nr);
+ ma= give_current_material(ob, nr);
+ if(ma==NULL) ma= &defmaterial;
+
+ return ma;
}
/* ------------------------------------------------------------------------- */
@@ -1197,10 +1196,9 @@ static void init_render_mball(Object *ob)
MTC_Mat3CpyMat4(imat, ob->imat);
ma= give_render_material(ob, 1);
- if(ma==0) ma= &defmaterial;
need_orco= 0;
- if(ma->ren->texco & TEXCO_ORCO) {
+ if(ma->texco & TEXCO_ORCO) {
need_orco= 1;
}
@@ -1328,7 +1326,7 @@ static void init_render_mesh(Object *ob)
for(a=1; a<=ob->totcol; a++) {
ma= give_render_material(ob, a);
if(ma) {
- if(ma->ren->texco & TEXCO_ORCO) {
+ if(ma->texco & TEXCO_ORCO) {
need_orco= 1;
break;
}
@@ -1398,8 +1396,6 @@ static void init_render_mesh(Object *ob)
orco= me->orco;
ma= give_render_material(ob, 1);
- if(ma==0) ma= &defmaterial;
-
if(ma->mode & MA_HALO) {
make_render_halos(ob, me, totvert, mvert, ma, extverts);
@@ -1444,7 +1440,6 @@ static void init_render_mesh(Object *ob)
for(a1=0; (a1<ob->totcol || (a1==0 && ob->totcol==0)); a1++) {
ma= give_render_material(ob, a1+1);
- if(ma==0) ma= &defmaterial;
/* test for 100% transparant */
ok= 1;
@@ -1804,14 +1799,12 @@ void RE_add_render_lamp(Object *ob, int doshadbuf)
lar->mode &= ~LA_SHAD_RAY;
}
}
-
- lar->org= MEM_dupallocN(lar);
-
}
/* ------------------------------------------------------------------------- */
static void init_render_surf(Object *ob)
{
+ extern Material defmaterial; // initrender.c
Nurb *nu=0;
Curve *cu;
ListBase displist;
@@ -1840,8 +1833,7 @@ static void init_render_surf(Object *ob)
matar[0]= &defmaterial;
for(a=0; a<ob->totcol; a++) {
matar[a]= give_render_material(ob, a+1);
- if(matar[a]==0) matar[a]= &defmaterial;
- if(matar[a] && matar[a]->ren->texco & TEXCO_ORCO) {
+ if(matar[a] && matar[a]->texco & TEXCO_ORCO) {
need_orco= 1;
}
}
@@ -2185,8 +2177,8 @@ static void init_render_surf(Object *ob)
static void init_render_curve(Object *ob)
{
+ extern Material defmaterial; // initrender.c
Ika *ika=0;
-
Lattice *lt=0;
Curve *cu;
VertRen *ver;
@@ -2228,8 +2220,7 @@ static void init_render_curve(Object *ob)
matar[0]= &defmaterial;
for(a=0; a<ob->totcol; a++) {
matar[a]= give_render_material(ob, a+1);
- if(matar[a]==0) matar[a]= &defmaterial;
- if(matar[a]->ren->texco & TEXCO_ORCO) {
+ if(matar[a]->texco & TEXCO_ORCO) {
need_orco= 1;
}
}
@@ -2681,7 +2672,6 @@ void RE_freeRotateBlenderScene(void)
MEM_freeN(shb->cbuf);
MEM_freeN(R.la[a]->shb);
}
- if(R.la[a]->org) MEM_freeN(R.la[a]->org);
if(R.la[a]->jitter) MEM_freeN(R.la[a]->jitter);
MEM_freeN(R.la[a]);
}
@@ -2898,9 +2888,6 @@ void RE_rotateBlenderScene(void)
if(G.scene->camera==0) return;
- O.dxwin[0]= 0.5/(float)R.r.xsch;
- O.dywin[1]= 0.5/(float)R.r.ysch;
-
slurph_opt= 0;
R.totvlak=R.totvert=R.totlamp=R.tothalo= 0;
@@ -3123,6 +3110,78 @@ void RE_rotateBlenderScene(void)
set_normalflags();
}
+/* **************************************************************** */
+/* sticky texture coords */
+/* **************************************************************** */
+
+void RE_make_sticky(void)
+{
+ Object *ob;
+ Base *base;
+ MVert *mvert;
+ Mesh *me;
+ MSticky *ms;
+ float ho[4], mat[4][4];
+ int a;
+
+ if(G.scene->camera==0) return;
+
+ if(G.obedit) {
+ error("Unable to make sticky in Edit Mode");
+ return;
+ }
+ base= FIRSTBASE;
+ while(base) {
+ if TESTBASELIB(base) {
+ if(base->object->type==OB_MESH) {
+ ob= base->object;
+
+ me= ob->data;
+ mvert= me->mvert;
+ if(me->msticky) MEM_freeN(me->msticky);
+ me->msticky= MEM_mallocN(me->totvert*sizeof(MSticky), "sticky");
+
+ /* like convert to render data */
+ R.r= G.scene->r;
+ R.r.xsch= (R.r.size*R.r.xsch)/100;
+ R.r.ysch= (R.r.size*R.r.ysch)/100;
+
+ R.afmx= R.r.xsch/2;
+ R.afmy= R.r.ysch/2;
+
+ R.ycor= ( (float)R.r.yasp)/( (float)R.r.xasp);
+
+ R.rectx= R.r.xsch;
+ R.recty= R.r.ysch;
+ R.xstart= -R.afmx;
+ R.ystart= -R.afmy;
+ R.xend= R.xstart+R.rectx-1;
+ R.yend= R.ystart+R.recty-1;
+
+ where_is_object(G.scene->camera);
+ Mat4CpyMat4(R.viewinv, G.scene->camera->obmat);
+ Mat4Ortho(R.viewinv);
+ Mat4Invert(R.viewmat, R.viewinv);
+
+ RE_setwindowclip(1, -1);
+
+ where_is_object(ob);
+ Mat4MulMat4(mat, ob->obmat, R.viewmat);
+
+ ms= me->msticky;
+ for(a=0; a<me->totvert; a++, ms++, mvert++) {
+ VECCOPY(ho, mvert->co);
+ Mat4MulVecfl(mat, ho);
+ RE_projectverto(ho, ho);
+ ms->co[0]= ho[0]/ho[3];
+ ms->co[1]= ho[1]/ho[3];
+ }
+ }
+ }
+ base= base->next;
+ }
+}
+
/* **************************************************************** */
/* Displacement mapping */
@@ -3136,7 +3195,7 @@ static short test_for_displace(Object *ob)
for (i=1; i<=ob->totcol; i++) {
ma=give_render_material(ob, i);
/* ma->mapto is ORed total of all mapto channels */
- if(ma && (ma->ren->mapto & MAP_DISPLACE)) return 1;
+ if(ma && (ma->mapto & MAP_DISPLACE)) return 1;
}
return 0;
}
@@ -3185,10 +3244,10 @@ static void displace_render_face(VlakRen *vlr, float *scale)
shi.osatex= 0; /* signal not to use dx[] and dy[] texture AA vectors */
shi.vlr= vlr; /* current render face */
shi.mat= vlr->mat; /* current input material */
- shi.matren= shi.mat->ren; /* material temp block where output is written into */
+
/* UV coords must come from face */
- hasuv = vlr->tface && (shi.matren->texco & TEXCO_UV);
+ hasuv = vlr->tface && (shi.mat->texco & TEXCO_UV);
if (hasuv) shi.uv[2]=0.0f;
/* I don't think this is used, but seting it just in case */
@@ -3244,7 +3303,7 @@ static void displace_render_face(VlakRen *vlr, float *scale)
static void displace_render_vert(ShadeInput *shi, VertRen *vr, float *scale)
{
- short texco= shi->matren->texco;
+ short texco= shi->mat->texco;
float sample=0;
/* shi->co is current render coord, just make sure at least some vector is here */
VECCOPY(shi->co, vr->co);
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index 3aa41c0f7fc..6b27cf32113 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -153,6 +153,8 @@
#include "LOD_DependKludge.h"
#include "LOD_decimation.h"
+#include "RE_renderconverter.h" // make_sticky
+
#include "butspace.h" // own module
static int decim_faces=0;
@@ -441,6 +443,7 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
new_material_to_objectdata((G.scene->basact) ? (G.scene->basact->object) : 0);
scrarea_queue_winredraw(curarea);
BIF_undo_push("New material");
+ allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWVIEW3D_Z, 0);
allqueue(REDRAWOOPS, 0);
break;
@@ -448,6 +451,7 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
delete_material_index();
scrarea_queue_winredraw(curarea);
BIF_undo_push("Delete material index");
+ allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWVIEW3D_Z, 0);
allqueue(REDRAWOOPS, 0);
break;
@@ -1899,7 +1903,8 @@ void do_meshbuts(unsigned short event)
allqueue(REDRAWBUTSEDIT, 0);
break;
case B_MAKESTICKY:
- make_sticky();
+ RE_make_sticky();
+ allqueue(REDRAWBUTSEDIT, 0);
break;
case B_MAKEEDGES:
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index 98a856a731d..4561b183b7d 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -64,14 +64,15 @@
#include "BIF_gl.h"
#include "BIF_graphics.h"
+#include "BIF_glutil.h"
+#include "BIF_interface.h"
#include "BIF_keyval.h"
#include "BIF_mainqueue.h"
+#include "BIF_mywindow.h"
#include "BIF_resources.h"
+#include "BIF_renderwin.h"
#include "BIF_screen.h"
-#include "BIF_mywindow.h"
#include "BIF_space.h"
-#include "BIF_glutil.h"
-#include "BIF_interface.h"
#include "BIF_toolbox.h"
#include "BIF_butspace.h"
@@ -85,7 +86,6 @@
#include "DNA_image_types.h"
#include "BKE_writeavi.h"
#include "BKE_image.h"
-#include "BIF_renderwin.h"
#include "BIF_writeimage.h"
#include "BIF_writeavicodec.h"
#include "BIF_editsound.h"
@@ -475,7 +475,7 @@ static void run_playanim(char *file) {
char str[FILE_MAXDIR+FILE_MAXFILE];
int pos[2], size[2];
- calc_renderwin_rectangle(R.winpos, pos, size);
+ calc_renderwin_rectangle(G.winpos, pos, size);
sprintf(str, "%s -a -p %d %d \"%s\"", bprogname, pos[0], pos[1], file);
system(str);
@@ -793,6 +793,21 @@ void do_render_panels(unsigned short event)
case B_CLEARSET:
scene_change_set(G.scene, NULL);
break;
+ case B_FBUF_REDO:
+ if(R.rectftot) {
+ /* copy is needed... not so nice, but how better? */
+ R.r.postgamma= G.scene->r.postgamma;
+ R.r.postigamma= 1.0/R.r.postgamma;
+ R.r.postadd= G.scene->r.postadd;
+ R.r.postmul= G.scene->r.postmul;
+ R.r.posthue= G.scene->r.posthue;
+ R.r.postsat= G.scene->r.postsat;
+ R.r.dither_intensity= G.scene->r.dither_intensity;
+
+ RE_floatbuffer_to_output();
+ BIF_redraw_render_rect();
+ }
+ break;
}
}
@@ -843,14 +858,18 @@ static uiBlock *post_render_menu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "post render", UI_EMBOSS, UI_HELV, curarea->win);
/* use this for a fake extra empy space around the buttons */
- uiDefBut(block, LABEL, 0, "", -10, 10, 200, 80, NULL, 0, 0, 0, 0, "");
-
- uiDefButF(block, NUMSLI, 0,"Add:", 0,60,180,19, &G.scene->r.postadd, -1.0, 1.0, 0, 0, "");
- uiDefButF(block, NUMSLI, 0,"Mul:", 0,40,180,19, &G.scene->r.postmul, 0.01, 4.0, 0, 0, "");
- uiDefButF(block, NUMSLI, 0,"Gamma:", 0,20,180,19, &G.scene->r.postgamma, 0.2, 2.0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "", -10, -10, 200, 120, NULL, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUMSLI, 0, "Add:", 0,80,180,19, &G.scene->r.postadd, -1.0, 1.0, 0, 0, "");
+ uiDefButF(block, NUMSLI, 0, "Mul:", 0,60,180,19, &G.scene->r.postmul, 0.01, 4.0, 0, 0, "");
+ uiDefButF(block, NUMSLI, 0, "Gamma:", 0,40,180,19, &G.scene->r.postgamma, 0.1, 4.0, 0, 0, "");
+ uiDefButF(block, NUMSLI, 0, "Hue:", 0,20,180,19, &G.scene->r.posthue, -0.5, 0.5, 0, 0, "");
+ uiDefButF(block, NUMSLI, 0, "Sat:", 0, 0,180,19, &G.scene->r.postsat, 0.0, 4.0, 0, 0, "");
uiBlockSetDirection(block, UI_TOP);
+ addqueue(curarea->win, UI_BUT_EVENT, B_FBUF_REDO);
+
return block;
}
@@ -1039,41 +1058,47 @@ static void render_panel_output(void)
uiBlockEndAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1);
- uiDefButS(block, TOG|BIT|0, 0,"Backbuf", 10, 94, 60, 20, &G.scene->r.bufflag, 0, 0, 0, 0, "Enable/Disable use of Backbuf image");
+ uiDefButS(block, TOG|BIT|0, B_NOP,"Backbuf", 10, 94, 80, 20, &G.scene->r.bufflag, 0, 0, 0, 0, "Enable/Disable use of Backbuf image");
+ uiDefButI(block, TOG|BIT|19, B_NOP,"Threads", 10, 68, 80, 20, &G.scene->r.mode, 0, 0, 0, 0, "Enable/Disable render in two threads");
uiBlockSetCol(block, TH_AUTO);
uiBlockBeginAlign(block);
for(b=2; b>=0; b--)
for(a=0; a<3; a++)
- uiDefButS(block, TOG|BIT|(3*b+a), 800,"", (short)(10+18*a),(short)(10+14*b),16,12, &R.winpos, 0, 0, 0, 0, "Render window placement on screen");
+ uiDefButS(block, TOG|BIT|(3*b+a), 800,"", (short)(10+18*a),(short)(10+14*b),16,12, &G.winpos, 0, 0, 0, 0, "Render window placement on screen");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefButS(block, TOG|BIT|2, REDRAWVIEW3D, "Passepartout", 72, 30, 122, 20, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Draws darkened passepartout in camera view");
- uiDefButS(block, ROW, B_REDR, "DispWin", 72, 10, 60, 20, &R.displaymode, 0.0, (float)R_DISPLAYWIN, 0, 0, "Sets render output to display in a seperate window");
- uiDefButS(block, ROW, B_REDR, "DispView", 134, 10, 60, 20, &R.displaymode, 0.0, (float)R_DISPLAYVIEW, 0, 0, "Sets render output to display in 3D view");
+ uiDefButS(block, ROW, B_REDR, "DispWin", 72, 10, 60, 20, &G.displaymode, 0.0, (float)R_DISPLAYWIN, 0, 0, "Sets render output to display in a seperate window");
+ uiDefButS(block, ROW, B_REDR, "DispView", 134, 10, 60, 20, &G.displaymode, 0.0, (float)R_DISPLAYVIEW, 0, 0, "Sets render output to display in 3D view");
uiBlockEndAlign(block);
- uiDefButS(block, TOG|BIT|4, 0, "Extensions", 250, 10, 60, 20, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Adds extensions to the output when rendering animations");
+ uiDefButS(block, TOG|BIT|4, 0, "Extensions", 205, 10, 105, 19, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Adds extensions to the output when rendering animations");
/* Dither control */
uiDefButF(block, NUM,B_DIFF, "Dither:", 205,31,105,19, &G.scene->r.dither_intensity, 0.0, 2.0, 0, 0, "The amount of dithering noise present in the output image (0.0 = no dithering)");
/* Toon shading buttons */
uiBlockBeginAlign(block);
- uiDefButI(block, TOG|BIT|5, 0,"Edge", 155, 94, 44, 20, &G.scene->r.mode, 0, 0, 0, 0, "Enable Toon shading");
- uiDefBlockBut(block, edge_render_menu, NULL, "Edge Settings", 200, 94, 110, 20, "Display edge settings");
- uiBlockEndAlign(block);
+ uiDefButI(block, TOG|BIT|5, 0,"Edge", 100, 94, 70, 20, &G.scene->r.mode, 0, 0, 0, 0, "Enable Toon edge shading");
+ uiDefBlockBut(block, edge_render_menu, NULL, "Edge Settings", 170, 94, 140, 20, "Display edge settings");
- /* unified render buttons */
- if(G.scene->r.mode & R_UNIFIED) {
- uiDefBlockBut(block, post_render_menu, NULL, "Post process", 200, 68, 110, 20, "Only for unified render");
- if (G.scene->r.mode & R_GAMMA) {
- uiDefButF(block, NUMSLI, 0,"Gamma:", 10, 68, 142, 20,
- &(G.scene->r.gamma), 0.2, 5.0, B_GAMMASLI, 0,
- "The gamma value for blending oversampled images (1.0 = no correction).");
- }
- }
+ /* postprocess render buttons */
+ uiBlockBeginAlign(block);
+ if(R.rectftot)
+ uiDefIconTextButI(block, TOG|BIT|18, B_NOP, ICON_IMAGE_DEHLT," Fbuf", 100, 68, 70, 20, &G.scene->r.mode, 0, 0, 0, 0, "Keep RGBA float buffer after render; buffer available");
+ else
+ uiDefButI(block, TOG|BIT|18, 0,"Fbuf", 100, 68, 70, 20, &G.scene->r.mode, 0, 0, 0, 0, "Keep RGBA float buffer after render, no buffer available now");
+ uiDefBlockBut(block, post_render_menu, NULL, "Post process", 170, 68, 140, 20, "Applies on RGBA floats while render or with Fbuf available");
+ uiBlockEndAlign(block);
+
+ /* removed, for time being unified and normal render will use same gamma for blending (2.0) */
+ //if (G.scene->r.mode & R_GAMMA) {
+ // uiDefButF(block, NUMSLI, 0,"Gamma:", 10, 68, 142, 20,
+ // &(G.scene->r.gamma), 0.2, 5.0, B_GAMMASLI, 0,
+ // "The gamma value for blending oversampled images (1.0 = no correction).");
+ //}
}
static void render_panel_render(void)
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index 99fd85b2ed1..35dd0196fd0 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -53,6 +53,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_packedFile_types.h"
+#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
@@ -82,7 +83,6 @@
/* Modules used */
#include "mydevice.h"
#include "blendef.h"
-#include "render.h"
#include "butspace.h" // event codes
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c
index 6bd1dbe25c3..cc6c3ae7558 100644
--- a/source/blender/src/drawmesh.c
+++ b/source/blender/src/drawmesh.c
@@ -68,6 +68,7 @@
#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_property.h"
+#include "BKE_utildefines.h"
#include "BIF_resources.h"
#include "BIF_gl.h"
@@ -785,7 +786,7 @@ static int set_gl_light(Object *ob)
static Material *give_current_material_or_def(Object *ob, int matnr)
{
- extern Material defmaterial;
+ extern Material defmaterial; // render module abuse...
Material *ma= give_current_material(ob, matnr);
return ma?ma:&defmaterial;
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index e9327f06a47..f3ea29b3056 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -127,7 +127,7 @@ static float matbuf[MAXMATBUF][2][4];
static void init_gl_materials(Object *ob)
{
- extern Material defmaterial;
+ extern Material defmaterial; // render module abuse...
Material *ma;
int a;
diff --git a/source/blender/src/drawseq.c b/source/blender/src/drawseq.c
index a5aba43f502..8f9b85a1ec1 100644
--- a/source/blender/src/drawseq.c
+++ b/source/blender/src/drawseq.c
@@ -56,9 +56,10 @@
#include "DNA_space_types.h"
#include "DNA_view2d_types.h"
-#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_plugin_types.h"
+#include "BKE_scene.h"
+#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "BIF_mywindow.h"
diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c
index 9f60de5153d..f631d7851d1 100644
--- a/source/blender/src/drawview.c
+++ b/source/blender/src/drawview.c
@@ -126,14 +126,9 @@
#include "butspace.h" // event codes
/* Modules used */
-#include "render.h"
+#include "render.h" // for ogl render
#include "radio.h"
-/* for physics in animation playback */
-#ifdef NAN_LINEAR_PHYSICS
-#include "sumo.h"
-#endif
-
/* locals */
void drawname(Object *ob);
void star_stuff_init_func(void);
@@ -2234,253 +2229,6 @@ double key_to_swaptime(int key)
return speed_to_swaptime(G.animspeed);
}
-#ifdef NAN_LINEAR_PHYSICS
-
-void sumo_callback(void *obp)
-{
- Object *ob= obp;
- SM_Vector3 vec;
- float matf[3][3];
- int i, j;
-
- SM_GetMatrixf(ob->sumohandle, ob->obmat[0]);
-
- VECCOPY(ob->loc, ob->obmat[3]);
-
- for (i = 0; i < 3; ++i) {
- for (j = 0; j < 3; ++j) {
- matf[i][j] = ob->obmat[i][j];
- }
- }
- Mat3ToEul(matf, ob->rot);
-}
-
-/* for test and fun, i've written the next functions to play with dynamics
- using a variant of play-anim... was never released nor really tested (ton) */
-
-void init_anim_sumo(void)
-{
- extern Material defmaterial;
- Base *base;
- Mesh *me;
- Object *ob;
- Material *mat;
- MFace *mface;
- MVert *mvert;
- float centre[3], size[3];
- int a;
- SM_ShapeHandle shape;
- SM_SceneHandle scene;
- SM_Material material;
- SM_MassProps massprops;
- SM_Vector3 vec;
- SM_Vector3 scaling;
-
- scene= SM_CreateScene();
- G.scene->sumohandle = scene;
-
- vec[0]= 0.0;
- vec[1]= 0.0;
- vec[2]= -9.8;
- SM_SetForceField(scene, vec);
-
- /* ton: cylinders & cones are still Y-axis up, will be Z-axis later */
- /* ton: write location/rotation save and restore */
-
- base= FIRSTBASE;
- while (base) {
- if (G.vd->lay & base->lay) {
- ob= base->object;
-
- /* define shape, for now only meshes take part in physics */
- get_local_bounds(ob, centre, size);
-
- if (ob->type==OB_MESH) {
- me= ob->data;
-
- if (ob->gameflag & OB_DYNAMIC) {
- if (me->sumohandle)
- shape= me->sumohandle;
- else {
- /* make new handle */
- switch(ob->boundtype) {
- case OB_BOUND_BOX:
- shape= SM_Box(2.0*size[0], 2.0*size[1], 2.0*size[2]);
- break;
- case OB_BOUND_SPHERE:
- shape= SM_Sphere(size[0]);
- break;
- case OB_BOUND_CYLINDER:
- shape= SM_Cylinder(size[0], 2.0*size[2]);
- break;
- case OB_BOUND_CONE:
- shape= SM_Cone(size[0], 2.0*size[2]);
- break;
- }
-
- me->sumohandle= shape;
- }
- /* sumo material properties */
- mat= give_current_material(ob, 0);
- if(mat==NULL)
- mat= &defmaterial;
-
- material.restitution= mat->reflect;
- material.static_friction= mat->friction;
- material.dynamic_friction= mat->friction;
-
- /* sumo mass properties */
- massprops.mass= ob->mass;
- massprops.center[0]= 0.0;
- massprops.center[1]= 0.0;
- massprops.center[2]= 0.0;
-
- massprops.inertia[0]= 0.5*ob->mass;
- massprops.inertia[1]= 0.5*ob->mass;
- massprops.inertia[2]= 0.5*ob->mass;
-
- massprops.orientation[0]= 0.0;
- massprops.orientation[1]= 0.0;
- massprops.orientation[2]= 0.0;
- massprops.orientation[3]= 1.0;
-
- ob->sumohandle = SM_CreateObject(ob, shape, &material,
- &massprops, sumo_callback);
- SM_AddObject(scene, ob->sumohandle);
-
- scaling[0] = ob->size[0];
- scaling[1] = ob->size[1];
- scaling[2] = ob->size[2];
- SM_SetMatrixf(ob->sumohandle, ob->obmat[0]);
- SM_SetScaling(ob->sumohandle, scaling);
-
- }
- else {
- if(me->sumohandle) shape= me->sumohandle;
- else {
- /* make new handle */
- shape= SM_NewComplexShape();
-
- mface= me->mface;
- mvert= me->mvert;
- for(a=0; a<me->totface; a++,mface++) {
- if(mface->v3) {
- SM_Begin();
- SM_Vertex( (mvert+mface->v1)->co[0], (mvert+mface->v1)->co[1], (mvert+mface->v1)->co[2]);
- SM_Vertex( (mvert+mface->v2)->co[0], (mvert+mface->v2)->co[1], (mvert+mface->v2)->co[2]);
- SM_Vertex( (mvert+mface->v3)->co[0], (mvert+mface->v3)->co[1], (mvert+mface->v3)->co[2]);
- if(mface->v4)
- SM_Vertex( (mvert+mface->v4)->co[0], (mvert+mface->v4)->co[1], (mvert+mface->v4)->co[2]);
- SM_End();
- }
- }
-
- SM_EndComplexShape();
-
- me->sumohandle= shape;
- }
- /* sumo material properties */
- mat= give_current_material(ob, 0);
- if(mat==NULL)
- mat= &defmaterial;
- material.restitution= mat->reflect;
- material.static_friction= mat->friction;
- material.dynamic_friction= mat->friction;
-
- /* sumo mass properties */
- massprops.mass= ob->mass;
- massprops.center[0]= 0.0;
- massprops.center[1]= 0.0;
- massprops.center[2]= 0.0;
-
- massprops.inertia[0]= 0.5*ob->mass;
- massprops.inertia[1]= 0.5*ob->mass;
- massprops.inertia[2]= 0.5*ob->mass;
-
- massprops.orientation[0]= 0.0;
- massprops.orientation[1]= 0.0;
- massprops.orientation[2]= 0.0;
- massprops.orientation[3]= 1.0;
-
- ob->sumohandle= SM_CreateObject(ob, shape, &material, NULL, NULL);
- SM_AddObject(scene, ob->sumohandle);
-
- scaling[0] = ob->size[0];
- scaling[1] = ob->size[1];
- scaling[2] = ob->size[2];
- SM_SetMatrixf(ob->sumohandle, ob->obmat[0]);
- SM_SetScaling(ob->sumohandle, scaling);
- }
- }
- }
- base= base->next;
- }
-}
-
-/* update animated objects */
-void update_anim_sumo(void)
-{
- SM_Vector3 scaling;
-
- Base *base;
- Object *ob;
- Mesh *me;
-
- base= FIRSTBASE;
- while(base) {
- if(G.vd->lay & base->lay) {
- ob= base->object;
-
- if(ob->sumohandle) {
- if((ob->gameflag & OB_DYNAMIC)==0) {
- /* maybe: optimise, check for anim */
- scaling[0] = ob->size[0];
- scaling[1] = ob->size[1];
- scaling[2] = ob->size[2];
- SM_SetMatrixf(ob->sumohandle, ob->obmat[0]);
- SM_SetScaling(ob->sumohandle, scaling);
- }
- }
- }
- base= base->next;
- }
-
-}
-
-void end_anim_sumo(void)
-{
- Base *base;
- Object *ob;
- Mesh *me;
-
- base= FIRSTBASE;
- while(base) {
- if(G.vd->lay & base->lay) {
- ob= base->object;
-
- if(ob->type==OB_MESH) {
- if(ob->sumohandle) {
- SM_RemoveObject(G.scene->sumohandle, ob->sumohandle);
- SM_DeleteObject(ob->sumohandle);
- ob->sumohandle= NULL;
- }
- me= ob->data;
- if(me->sumohandle) {
- SM_DeleteShape(me->sumohandle);
- me->sumohandle= NULL;
- }
- }
- }
- base= base->next;
- }
- if(G.scene->sumohandle) {
- SM_DeleteScene(G.scene->sumohandle);
- G.scene->sumohandle= NULL;
- }
-}
-
-#endif
-
void inner_play_anim_loop(int init, int mode)
{
ScrArea *sa;
@@ -2494,9 +2242,7 @@ void inner_play_anim_loop(int init, int mode)
swaptime= speed_to_swaptime(G.animspeed);
tottime= 0.0;
curmode= mode;
-#ifdef NAN_LINEAR_PHYSICS
- init_anim_sumo();
-#endif
+
return;
}
@@ -2511,11 +2257,7 @@ void inner_play_anim_loop(int init, int mode)
update_for_newframe_muted();
//test_all_displists();
-#ifdef NAN_LINEAR_PHYSICS
- update_anim_sumo();
-
- SM_Proceed(G.scene->sumohandle, swaptime, 40, NULL);
-#endif
+
sa= G.curscreen->areabase.first;
while(sa) {
if(sa==oldsa) {
@@ -2639,9 +2381,7 @@ int play_anim(int mode)
allqueue (REDRAWACTION, 0);
/* for the time being */
update_for_newframe_muted();
-#ifdef NAN_LINEAR_PHYSICS
- end_anim_sumo();
-#endif
+
waitcursor(0);
G.f &= ~G_PLAYANIM;
diff --git a/source/blender/src/editaction.c b/source/blender/src/editaction.c
index bed71e1a398..32110fa88e5 100644
--- a/source/blender/src/editaction.c
+++ b/source/blender/src/editaction.c
@@ -61,16 +61,17 @@
#include "DNA_mesh_types.h"
#include "DNA_lattice_types.h"
+#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_constraint.h"
-#include "BKE_displist.h"
#include "BKE_curve.h"
-#include "BKE_ipo.h"
+#include "BKE_displist.h"
#include "BKE_global.h"
+#include "BKE_ipo.h"
+#include "BKE_key.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_action.h"
-#include "BKE_key.h"
+#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "BIF_mywindow.h"
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c
index 16c44f5259f..efd5c30729e 100644
--- a/source/blender/src/editface.c
+++ b/source/blender/src/editface.c
@@ -57,6 +57,7 @@
#include "DNA_object_types.h"
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
+#include "DNA_scene_types.h"
#include "DNA_view3d_types.h"
#include "DNA_userdef_types.h"
@@ -87,7 +88,6 @@
#include "mydevice.h"
#include "blendef.h"
-#include "render.h"
#include "butspace.h"
#include "TPT_DependKludge.h"
diff --git a/source/blender/src/editipo.c b/source/blender/src/editipo.c
index fa327316642..8bffeda1b0c 100644
--- a/source/blender/src/editipo.c
+++ b/source/blender/src/editipo.c
@@ -62,23 +62,24 @@
#include "DNA_constraint_types.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
-#include "DNA_object_types.h"
-#include "DNA_lamp_types.h"
-#include "DNA_sequence_types.h"
-#include "DNA_sound_types.h"
#include "DNA_camera_types.h"
-#include "DNA_material_types.h"
-#include "DNA_texture_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_group_types.h"
+#include "DNA_ika_types.h"
+#include "DNA_ipo_types.h"
#include "DNA_key_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
-#include "DNA_ipo_types.h"
-#include "DNA_curve_types.h"
#include "DNA_space_types.h"
+#include "DNA_sequence_types.h"
+#include "DNA_sound_types.h"
+#include "DNA_texture_types.h"
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
-#include "DNA_group_types.h"
-#include "DNA_ika_types.h"
+#include "DNA_world_types.h"
#include "BKE_utildefines.h"
#include "BKE_action.h"
@@ -118,7 +119,6 @@
#include "blendef.h"
#include "mydevice.h"
-#include "render.h"
/* forwards */
#define BEZSELECTED(bezt) (((bezt)->f1 & 1) || ((bezt)->f2 & 1) || ((bezt)->f3 & 1))
diff --git a/source/blender/src/editlattice.c b/source/blender/src/editlattice.c
index 581278809d8..1469cf97d11 100644
--- a/source/blender/src/editlattice.c
+++ b/source/blender/src/editlattice.c
@@ -58,6 +58,7 @@
#include "BKE_displist.h"
#include "BKE_lattice.h"
#include "BKE_global.h"
+#include "BKE_utildefines.h"
#include "BIF_space.h"
#include "BIF_screen.h"
@@ -74,8 +75,6 @@
#include "blendef.h"
#include "mydevice.h"
-#include "render.h"
-
#include "BKE_armature.h"
/* ***************************** */
diff --git a/source/blender/src/editmball.c b/source/blender/src/editmball.c
index 609fc166764..096c5049c71 100644
--- a/source/blender/src/editmball.c
+++ b/source/blender/src/editmball.c
@@ -47,6 +47,7 @@
#include "DNA_screen_types.h"
#include "DNA_meta_types.h"
#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
#include "DNA_view3d_types.h"
#include "BKE_utildefines.h"
@@ -67,7 +68,6 @@
#include "BSE_edit.h"
#include "BSE_view.h"
-#include "render.h"
#include "blendef.h"
#include "mydevice.h"
diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c
index 69a8320b638..a9b1c3bbb45 100644
--- a/source/blender/src/editmesh.c
+++ b/source/blender/src/editmesh.c
@@ -93,7 +93,6 @@
#include "mydevice.h"
#include "blendef.h"
-#include "render.h"
/* own include */
#include "editmesh.h"
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index 19b862074bd..7919c6d0d77 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -95,7 +95,7 @@ editmesh_mods.c, UI level access, no geometry changes
#include "mydevice.h"
#include "blendef.h"
-#include "render.h" // externtex, badlevel call (ton)
+#include "render.h" // externtex
#include "editmesh.h"
@@ -2158,7 +2158,6 @@ void vertexsmooth(void)
void vertexnoise(void)
{
EditMesh *em = G.editMesh;
- extern float Tin;
Material *ma;
Tex *tex;
EditVert *eve;
@@ -2189,10 +2188,9 @@ void vertexnoise(void)
VecAddf(eve->co, eve->co, vec);
}
else {
-
- externtex(ma->mtex[0], eve->co);
-
- eve->co[2]+= 0.05*Tin;
+ float tin, dum;
+ externtex(ma->mtex[0], eve->co, &tin, &dum, &dum, &dum, &dum);
+ eve->co[2]+= 0.05*tin;
}
}
eve= eve->next;
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 9a65370c69e..1e6eb0dbf4c 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -60,6 +60,7 @@
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_camera_types.h"
+#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
#include "DNA_effect_types.h"
#include "DNA_ika_types.h"
@@ -68,6 +69,7 @@
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
#include "DNA_lattice_types.h"
+#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_meta_types.h"
@@ -80,7 +82,6 @@
#include "DNA_userdef_types.h"
#include "DNA_property_types.h"
#include "DNA_vfont_types.h"
-#include "DNA_constraint_types.h"
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
@@ -153,7 +154,6 @@
#include "BDR_editcurve.h"
#include "BDR_unwrapper.h"
-#include "render.h"
#include <time.h>
#include "mydevice.h"
#include "nla.h"
diff --git a/source/blender/src/editoops.c b/source/blender/src/editoops.c
index f6a26279c90..584d6a7b2d0 100644
--- a/source/blender/src/editoops.c
+++ b/source/blender/src/editoops.c
@@ -61,6 +61,7 @@
#include "BKE_scene.h"
#include "BKE_library.h"
#include "BKE_material.h"
+#include "BKE_utildefines.h"
#include "BIF_space.h"
#include "BIF_screen.h"
diff --git a/source/blender/src/editscreen.c b/source/blender/src/editscreen.c
index 2134b45a840..9d5c290aa6c 100644
--- a/source/blender/src/editscreen.c
+++ b/source/blender/src/editscreen.c
@@ -101,7 +101,7 @@
#include "BPY_extern.h"
#include "mydevice.h"
#include "blendef.h"
-#include "render.h"
+#include "render.h" /* R.flag */
#include "winlay.h"
diff --git a/source/blender/src/editseq.c b/source/blender/src/editseq.c
index d3fac5f87d2..7de296bd7b6 100644
--- a/source/blender/src/editseq.c
+++ b/source/blender/src/editseq.c
@@ -70,6 +70,7 @@
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_scene.h"
#include "BIF_space.h"
#include "BIF_interface.h"
diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c
index b3436b70ba7..9c3b8f30033 100644
--- a/source/blender/src/editsima.c
+++ b/source/blender/src/editsima.c
@@ -63,6 +63,7 @@
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_displist.h"
+#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "BIF_interface.h"
diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c
index 43ca05840b8..4440ecaa86d 100644
--- a/source/blender/src/filesel.c
+++ b/source/blender/src/filesel.c
@@ -65,6 +65,7 @@
#include "DNA_image_types.h"
#include "DNA_ipo_types.h"
#include "DNA_vfont_types.h"
+#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "DNA_texture_types.h"
@@ -101,7 +102,6 @@
#include "mydevice.h"
#include "blendef.h"
-#include "render.h"
#include "nla.h"
diff --git a/source/blender/src/header_action.c b/source/blender/src/header_action.c
index ba65c029362..2d86f7a44e2 100644
--- a/source/blender/src/header_action.c
+++ b/source/blender/src/header_action.c
@@ -74,6 +74,7 @@
#include "BKE_main.h"
#include "BKE_constraint.h"
#include "BKE_armature.h"
+#include "BKE_utildefines.h"
#include "BSE_drawipo.h"
#include "BSE_editaction.h"
diff --git a/source/blender/src/header_image.c b/source/blender/src/header_image.c
index 597b1985aa9..2987ca7e53f 100644
--- a/source/blender/src/header_image.c
+++ b/source/blender/src/header_image.c
@@ -67,6 +67,7 @@
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_packedFile.h"
+#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
#include "BIF_drawimage.h"
diff --git a/source/blender/src/header_info.c b/source/blender/src/header_info.c
index 61a74d0ae2d..3221115931e 100644
--- a/source/blender/src/header_info.c
+++ b/source/blender/src/header_info.c
@@ -111,8 +111,6 @@
#include "BPY_extern.h"
#include "BPY_menus.h"
-#include "render.h" // for R - should use BKE_bad_level_calls.h instead?
-
#include "blendef.h"
#include "mydevice.h"
@@ -1524,7 +1522,7 @@ static void run_playanim(char *file)
char str[FILE_MAXDIR+FILE_MAXFILE];
int pos[2], size[2];
- calc_renderwin_rectangle(R.winpos, pos, size);
+ calc_renderwin_rectangle(G.winpos, pos, size);
sprintf(str, "%s -a -p %d %d \"%s\"", bprogname, pos[0], pos[1], file);
system(str);
diff --git a/source/blender/src/header_nla.c b/source/blender/src/header_nla.c
index cdf2763eeab..1e821a14271 100644
--- a/source/blender/src/header_nla.c
+++ b/source/blender/src/header_nla.c
@@ -58,14 +58,17 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_utildefines.h"
+
#include "BIF_interface.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_editnla.h"
-#include "BKE_global.h"
-#include "BKE_main.h"
#include "BSE_drawipo.h"
#include "BSE_headerbuttons.h"
diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c
index 20852aa1464..6a2d139f17d 100644
--- a/source/blender/src/headerbuttons.c
+++ b/source/blender/src/headerbuttons.c
@@ -173,7 +173,6 @@
#include "mydevice.h"
#include "blendef.h"
-#include "render.h"
#include "nla.h" /* __NLA : To be removed later */
#include "butspace.h" // test_idbutton
diff --git a/source/blender/src/meshtools.c b/source/blender/src/meshtools.c
index bf832024d20..6279dba6c89 100644
--- a/source/blender/src/meshtools.c
+++ b/source/blender/src/meshtools.c
@@ -35,7 +35,6 @@
meshtools.c: no editmode, tools operating on meshes
void join_mesh(void);
-void make_sticky(void);
void fasterdraw(void);
void slowerdraw(void);
@@ -91,8 +90,6 @@ void sort_faces(void);
#include "mydevice.h"
#include "blendef.h"
-#include "render.h" // bad level call (ton)
-
/* * ********************** no editmode!!! *********** */
@@ -440,75 +437,6 @@ void join_mesh(void)
}
-void make_sticky(void)
-{
- Object *ob;
- Base *base;
- MVert *mvert;
- Mesh *me;
- MSticky *ms;
- float ho[4], mat[4][4];
- int a;
-
- if(G.scene->camera==0) return;
-
- if(G.obedit) {
- error("Unable to make sticky in Edit Mode");
- return;
- }
- base= FIRSTBASE;
- while(base) {
- if TESTBASELIB(base) {
- if(base->object->type==OB_MESH) {
- ob= base->object;
-
- me= ob->data;
- mvert= me->mvert;
- if(me->msticky) MEM_freeN(me->msticky);
- me->msticky= MEM_mallocN(me->totvert*sizeof(MSticky), "sticky");
-
- /* like convert to render data */
- R.r= G.scene->r;
- R.r.xsch= (R.r.size*R.r.xsch)/100;
- R.r.ysch= (R.r.size*R.r.ysch)/100;
-
- R.afmx= R.r.xsch/2;
- R.afmy= R.r.ysch/2;
-
- R.ycor= ( (float)R.r.yasp)/( (float)R.r.xasp);
-
- R.rectx= R.r.xsch;
- R.recty= R.r.ysch;
- R.xstart= -R.afmx;
- R.ystart= -R.afmy;
- R.xend= R.xstart+R.rectx-1;
- R.yend= R.ystart+R.recty-1;
-
- where_is_object(G.scene->camera);
- Mat4CpyMat4(R.viewinv, G.scene->camera->obmat);
- Mat4Ortho(R.viewinv);
- Mat4Invert(R.viewmat, R.viewinv);
-
- RE_setwindowclip(1, -1);
-
- where_is_object(ob);
- Mat4MulMat4(mat, ob->obmat, R.viewmat);
-
- ms= me->msticky;
- for(a=0; a<me->totvert; a++, ms++, mvert++) {
- VECCOPY(ho, mvert->co);
- Mat4MulVecfl(mat, ho);
- RE_projectverto(ho, ho);
- ms->co[0]= ho[0]/ho[3];
- ms->co[1]= ho[1]/ho[3];
- }
- }
- }
- base= base->next;
- }
- allqueue(REDRAWBUTSEDIT, 0);
-}
-
void fasterdraw(void)
{
Base *base;
diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c
index 52cf6734e2d..970083f0a35 100644
--- a/source/blender/src/previewrender.c
+++ b/source/blender/src/previewrender.c
@@ -61,6 +61,7 @@
#include "DNA_world_types.h"
#include "DNA_camera_types.h"
#include "DNA_image_types.h"
+#include "DNA_material_types.h"
#include "DNA_object_types.h"
#include "DNA_lamp_types.h"
#include "DNA_space_types.h"
@@ -407,7 +408,7 @@ static void sky_preview_pixel(float lens, int x, int y, char *rect)
static void lamp_preview_pixel(ShadeInput *shi, LampRen *la, int x, int y, char *rect)
{
- float inpr, i, t, dist, distkw, vec[3];
+ float inpr, i, t, dist, distkw, vec[3], lacol[3];
int col;
shi->co[0]= (float)x/(PR_RECTX/4);
@@ -420,7 +421,11 @@ static void lamp_preview_pixel(ShadeInput *shi, LampRen *la, int x, int y, char
VECCOPY(shi->view, vec);
dist= Normalise(shi->view);
- if(la->mode & LA_TEXTURE) do_lamp_tex(la, vec, shi);
+ lacol[0]= la->r;
+ lacol[1]= la->g;
+ lacol[2]= la->b;
+
+ if(la->mode & LA_TEXTURE) do_lamp_tex(la, vec, shi, lacol);
if(la->type==LA_SUN || la->type==LA_HEMI) {
dist= 1.0;
@@ -471,13 +476,13 @@ static void lamp_preview_pixel(ShadeInput *shi, LampRen *la, int x, int y, char
}
else if ELEM(la->type, LA_LOCAL, LA_AREA) dist*= shi->view[2];
- col= 255.0*dist*la->r;
+ col= 255.0*dist*lacol[0];
if(col<=0) rect[0]= 0; else if(col>=255) rect[0]= 255; else rect[0]= col;
- col= 255.0*dist*la->g;
+ col= 255.0*dist*lacol[1];
if(col<=0) rect[1]= 0; else if(col>=255) rect[1]= 255; else rect[1]= col;
- col= 255.0*dist*la->b;
+ col= 255.0*dist*lacol[2];
if(col<=0) rect[2]= 0; else if(col>=255) rect[2]= 255; else rect[2]= col;
}
@@ -492,9 +497,9 @@ static void init_previewhalo(HaloRen *har, Material *mat)
har->radsq= PR_RECTX*PR_RECTX/4.0;
har->alfa= mat->alpha;
har->add= 255.0*mat->add;
- har->r= 255.0*mat->r;
- har->g= 255.0*mat->g;
- har->b= 255.0*mat->b;
+ har->r= mat->r;
+ har->g= mat->g;
+ har->b= mat->b;
har->xs= PR_RECTX/2.0;
har->ys= PR_RECTX/2.0;
har->zs= har->zd= 0;
@@ -520,7 +525,7 @@ static void init_previewhalo(HaloRen *har, Material *mat)
static void halo_preview_pixel(HaloRen *har, int startx, int endx, int y, char *rect)
{
- float dist, xn, yn, xsq, ysq;
+ float dist, xn, yn, xsq, ysq, colf[4];
int x;
char front[4];
@@ -536,10 +541,8 @@ static void halo_preview_pixel(HaloRen *har, int startx, int endx, int y, char *
xsq= xn*xn;
dist= xsq+ysq;
-
-
if(dist<har->radsq) {
- RE_shadehalo(har, front, 0, dist, xn, yn, har->flarec);
+ RE_shadehalo(har, front, colf, 0, dist, xn, yn, har->flarec);
RE_addalphaAddfac(rect, front, har->add);
}
rect+= 4;
@@ -591,12 +594,12 @@ static void previewflare(SpaceButs *sbuts, HaloRen *har, unsigned int *rect)
R.rectot= rectot;
}
-extern float Tin, Tr, Tg, Tb, Ta; /* texture.c */
static void texture_preview_pixel(Tex *tex, int x, int y, char *rect)
{
- float i, v1, xsq, ysq, texvec[3], dummy[3];
+ float i, v1, xsq, ysq, texvec[3];
+ float tin=1.0, tr, tg, tb, ta;
int rgbnor, tracol, skip=0;
-
+
if(tex->type==TEX_IMAGE) {
v1= 1.0/PR_RECTX;
@@ -637,12 +640,12 @@ static void texture_preview_pixel(Tex *tex, int x, int y, char *rect)
}
else {
skip= 1;
- Ta= 0.0;
+ ta= 0.0;
}
}
else {
skip= 1;
- Ta= 0.0;
+ ta= 0.0;
}
}
else {
@@ -653,44 +656,32 @@ static void texture_preview_pixel(Tex *tex, int x, int y, char *rect)
texvec[2]= 0.0;
}
- /* does not return Tin */
- if(tex->type==TEX_STUCCI) {
- tex->nor= dummy;
- dummy[0]= 1.0;
- dummy[1]= dummy[2]= 0.0;
- }
-
- if(skip==0) rgbnor= multitex(tex, texvec, NULL, NULL, 0);
+ if(skip==0) rgbnor= multitex_ext(tex, texvec, &tin, &tr, &tg, &tb, &ta);
else rgbnor= 1;
if(rgbnor & 1) {
- v1= 255.0*Tr;
+ v1= 255.0*tr;
rect[0]= CLAMPIS(v1, 0, 255);
- v1= 255.0*Tg;
+ v1= 255.0*tg;
rect[1]= CLAMPIS(v1, 0, 255);
- v1= 255.0*Tb;
+ v1= 255.0*tb;
rect[2]= CLAMPIS(v1, 0, 255);
- if(Ta!=1.0) {
+ if(ta!=1.0) {
tracol= 64+100*(abs(x)>abs(y));
- tracol= (1.0-Ta)*tracol;
+ tracol= (1.0-ta)*tracol;
- rect[0]= tracol+ (rect[0]*Ta) ;
- rect[1]= tracol+ (rect[1]*Ta) ;
- rect[2]= tracol+ (rect[2]*Ta) ;
+ rect[0]= tracol+ (rect[0]*ta) ;
+ rect[1]= tracol+ (rect[1]*ta) ;
+ rect[2]= tracol+ (rect[2]*ta) ;
}
}
else {
-
- if(tex->type==TEX_STUCCI) {
- Tin= 0.5 + 0.7*tex->nor[0];
- CLAMP(Tin, 0.0, 1.0);
- }
- rect[0]= 255.0*Tin;
- rect[1]= 255.0*Tin;
- rect[2]= 255.0*Tin;
+ rect[0]= 255.0*tin;
+ rect[1]= 255.0*tin;
+ rect[2]= 255.0*tin;
}
}
@@ -740,14 +731,23 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y,char *
int temp, a;
char tracol;
- mat= shi->matren;
+ mat= shi->mat;
+ // copy all relevant material vars, note, keep this synced with render_types.h
+ memcpy(&shi->r, &mat->r, 23*sizeof(float));
+ // set special cases:
+ shi->har= mat->har;
+ if((mat->mode & MA_RAYMIRROR)==0) shi->ray_mirror= 0.0;
+
v1= 1.0/PR_RECTX;
shi->view[0]= v1*x;
shi->view[1]= v1*y;
shi->view[2]= 1.0;
Normalise(shi->view);
+ shi->xs= (float)x;
+ shi->ys= (float)y;
+
shi->refcol[0]= shi->refcol[1]= shi->refcol[2]= shi->refcol[3]= 0.0;
/* texture handling */
@@ -824,7 +824,7 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y,char *
}
/* set it here, because ray_mirror will affect it */
- alpha= mat->alpha;
+ alpha= shi->alpha;
if(mat->mapto & MAP_DISPLACE) { /* Quick hack of fake displacement preview */
shi->vn[0]-=2.0*shi->displace[2];
@@ -838,13 +838,13 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y,char *
alpha*= fresnel_fac(shi->view, shi->vn, mat->fresnel_tra_i, mat->fresnel_tra);
if(mat->mode & MA_SHLESS) {
- temp= 255.0*(mat->r);
+ temp= 255.0*(shi->r);
if(temp>255) rect[0]= 255; else if(temp<0) rect[0]= 0; else rect[0]= temp;
- temp= 255.0*(mat->g);
+ temp= 255.0*(shi->g);
if(temp>255) rect[1]= 255; else if(temp<0) rect[1]= 0; else rect[1]= temp;
- temp= 255.0*(mat->b);
+ temp= 255.0*(shi->b);
if(temp>255) rect[2]= 255; else if(temp<0) rect[2]= 0; else rect[2]= temp;
}
else {
@@ -864,22 +864,22 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y,char *
is= shi->vn[0]*lv[0]+shi->vn[1]*lv[1]+shi->vn[2]*lv[2];
if(is<0.0) is= 0.0;
- if(mat->spec) {
+ if(shi->spec>0.0) {
if(is>0.0) {
/* specular shaders */
float specfac;
if(mat->spec_shader==MA_SPEC_PHONG)
- specfac= Phong_Spec(shi->vn, lv, shi->view, mat->har);
+ specfac= Phong_Spec(shi->vn, lv, shi->view, shi->har);
else if(mat->spec_shader==MA_SPEC_COOKTORR)
- specfac= CookTorr_Spec(shi->vn, lv, shi->view, mat->har);
+ specfac= CookTorr_Spec(shi->vn, lv, shi->view, shi->har);
else if(mat->spec_shader==MA_SPEC_BLINN)
- specfac= Blinn_Spec(shi->vn, lv, shi->view, mat->refrac, (float)mat->har);
+ specfac= Blinn_Spec(shi->vn, lv, shi->view, mat->refrac, (float)shi->har);
else
specfac= Toon_Spec(shi->vn, lv, shi->view, mat->param[2], mat->param[3]);
- inprspec= specfac*mat->spec;
+ inprspec= specfac*shi->spec;
if(mat->mode & MA_RAMP_SPEC) {
float spec[3];
@@ -889,9 +889,9 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y,char *
isb+= inprspec*spec[2];
}
else {
- isr+= inprspec*mat->specr;
- isg+= inprspec*mat->specg;
- isb+= inprspec*mat->specb;
+ isr+= inprspec*shi->specr;
+ isg+= inprspec*shi->specg;
+ isb+= inprspec*shi->specb;
}
}
}
@@ -900,7 +900,7 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y,char *
else if(mat->diff_shader==MA_DIFF_TOON) is= Toon_Diff(shi->vn, lv, shi->view, mat->param[0], mat->param[1]);
// else Lambert
- inp= (mat->ref*is + mat->emit);
+ inp= (shi->refl*is + shi->emit);
if(a==0) la= pr1_col;
else la= pr2_col;
@@ -924,7 +924,7 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y,char *
/* scale */
div= (0.85*shi->ref[1]);
- shi->refcol[0]= mat->ray_mirror*fresnel_fac(shi->view, shi->vn, mat->fresnel_mir_i, mat->fresnel_mir);
+ shi->refcol[0]= shi->ray_mirror*fresnel_fac(shi->view, shi->vn, mat->fresnel_mir_i, mat->fresnel_mir);
/* not real 'alpha', but mirror overriding transparency */
if(mat->mode & MA_RAYTRANSP) {
float fac= sqrt(shi->refcol[0]);
@@ -953,40 +953,40 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y,char *
if(mat->mode & MA_RAMP_SPEC) ramp_spec_result(&isr, &isg, &isb, shi);
if(shi->refcol[0]==0.0) {
- a= 255.0*(diff[0] +mat->ambr +isr);
+ a= 255.0*(diff[0] +shi->ambr +isr);
if(a>255) a=255; else if(a<0) a= 0;
rect[0]= a;
- a= 255.0*(diff[1] +mat->ambg +isg);
+ a= 255.0*(diff[1] +shi->ambg +isg);
if(a>255) a=255; else if(a<0) a= 0;
rect[1]= a;
- a= 255*(diff[2] +mat->ambb +isb);
+ a= 255*(diff[2] +shi->ambb +isb);
if(a>255) a=255; else if(a<0) a= 0;
rect[2]= a;
}
else {
- a= 255.0*( mat->mirr*shi->refcol[1] + (1.0 - mat->mirr*shi->refcol[0])*(diff[0] +mat->ambr) +isr);
+ a= 255.0*( shi->mirr*shi->refcol[1] + (1.0 - shi->mirr*shi->refcol[0])*(diff[0] +shi->ambr) +isr);
if(a>255) a=255; else if(a<0) a= 0;
rect[0]= a;
- a= 255.0*( mat->mirg*shi->refcol[2] + (1.0 - mat->mirg*shi->refcol[0])*(diff[1] +mat->ambg) +isg);
+ a= 255.0*( shi->mirg*shi->refcol[2] + (1.0 - shi->mirg*shi->refcol[0])*(diff[1] +shi->ambg) +isg);
if(a>255) a=255; else if(a<0) a= 0;
rect[1]= a;
- a= 255.0*( mat->mirb*shi->refcol[3] + (1.0 - mat->mirb*shi->refcol[0])*(diff[2] +mat->ambb) +isb);
+ a= 255.0*( shi->mirb*shi->refcol[3] + (1.0 - shi->mirb*shi->refcol[0])*(diff[2] +shi->ambb) +isb);
if(a>255) a=255; else if(a<0) a= 0;
rect[2]= a;
}
}
/* ztra shade */
- if(mat->spectra!=0.0) {
+ if(shi->spectra!=0.0) {
inp = MAX3(isr, isg, isb);
- inp *= mat->spectra;
+ inp *= shi->spectra;
if(inp>1.0) inp= 1.0;
alpha= (1.0-inp)*alpha+inp;
}
if(alpha!=1.0) {
if(mat->mode & MA_RAYTRANSP) {
- refraction_prv(&x, &y, shi->vn, mat->ang);
+ refraction_prv(&x, &y, shi->vn, shi->ang);
}
tracol= previewback(mat->pr_back, x, y) & 255;
@@ -1091,8 +1091,8 @@ void BIF_previewrender(SpaceButs *sbuts)
}
}
shi.vlr= 0;
+
shi.mat= mat;
- shi.matren= mat->ren;
if(mat->mode & MA_HALO) init_previewhalo(&har, mat);
}
@@ -1293,7 +1293,6 @@ void BIF_previewrender(SpaceButs *sbuts)
}
else if(la) {
if(R.totlamp) {
- if(R.la[0]->org) MEM_freeN(R.la[0]->org);
MEM_freeN(R.la[0]);
}
R.totlamp= 0;
diff --git a/source/blender/src/renderwin.c b/source/blender/src/renderwin.c
index 5fbe58523cb..19b7ee96a15 100644
--- a/source/blender/src/renderwin.c
+++ b/source/blender/src/renderwin.c
@@ -72,7 +72,9 @@
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_mywindow.h"
+#include "BIF_previewrender.h"
#include "BIF_renderwin.h"
+#include "BIF_resources.h"
#include "BIF_toets.h"
#include "BDR_editobject.h"
@@ -111,6 +113,9 @@
/* forces draw of alpha */
#define RW_FLAGS_ALPHA (1<<4)
+/* space for info text */
+#define RW_HEADERY 18
+
typedef struct {
Window *win;
@@ -125,6 +130,8 @@ typedef struct {
float pan_mouse_start[2], pan_ofs_start[2];
char *info_text;
+ char *render_text, *render_text_spare;
+
} RenderWin;
static RenderWin *render_win= NULL;
@@ -142,6 +149,7 @@ static RenderWin *renderwin_alloc(Window *win)
rw->flags= 0;
rw->zoomofs[0]= rw->zoomofs[1]= 0;
rw->info_text= NULL;
+ rw->render_text= rw->render_text_spare= NULL;
rw->lmouse[0]= rw->lmouse[1]= 0;
rw->mbut[0]= rw->mbut[1]= rw->mbut[2]= 0;
@@ -167,6 +175,7 @@ static void renderwin_get_disprect(RenderWin *rw, float disprect_r[2][2])
int w, h;
window_get_size(rw->win, &w, &h);
+ h-= RW_HEADERY;
display_w= R.rectx*rw->zoom;
display_h= R.recty*rw->zoom;
@@ -204,6 +213,7 @@ static int renderwin_win_to_ndc(RenderWin *rw, int win_co[2], float ndc_r[2])
int w, h;
window_get_size(rw->win, &w, &h);
+ h-= RW_HEADERY;
ndc_r[0]= ((float)(win_co[0]*2)/(w-1) - 1.0);
ndc_r[1]= ((float)(win_co[1]*2)/(h-1) - 1.0);
@@ -225,6 +235,8 @@ static void renderwin_reset_view(RenderWin *rw)
/* now calculate a zoom for when image is larger than window */
window_get_size(rw->win, &w, &h);
+ h-= RW_HEADERY;
+
/* at this point the r.rectx/y values are not correct yet */
rectx= (G.scene->r.size*G.scene->r.xsch)/100;
recty= (G.scene->r.size*G.scene->r.ysch)/100;
@@ -239,6 +251,34 @@ static void renderwin_reset_view(RenderWin *rw)
renderwin_queue_redraw(rw);
}
+static void renderwin_draw_render_info(RenderWin *rw)
+{
+ /* render text is added to top */
+ if(RW_HEADERY) {
+ float colf[3];
+ rcti rect;
+
+ window_get_size(rw->win, &rect.xmax, &rect.ymax);
+ rect.xmin= 0;
+ rect.ymin= rect.ymax-RW_HEADERY;
+ glEnable(GL_SCISSOR_TEST);
+ glaDefine2DArea(&rect);
+
+ /* clear header rect */
+ BIF_SetTheme(NULL); // sets view3d theme by default
+ BIF_GetThemeColor3fv(TH_HEADER, colf);
+ glClearColor(colf[0], colf[1], colf[2], 1.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ if(rw->render_text) {
+ BIF_ThemeColor(TH_TEXT);
+ glRasterPos2i(12, 5);
+ BMF_DrawString(G.fonts, rw->render_text);
+ }
+ }
+
+}
+
static void renderwin_draw(RenderWin *rw, int just_clear)
{
float disprect[2][2];
@@ -246,10 +286,15 @@ static void renderwin_draw(RenderWin *rw, int just_clear)
rect.xmin= rect.ymin= 0;
window_get_size(rw->win, &rect.xmax, &rect.ymax);
+ rect.ymax-= RW_HEADERY;
+
renderwin_get_disprect(rw, disprect);
window_make_active(rw->win);
+ /* do this first, so window ends with correct scissor */
+ renderwin_draw_render_info(rw);
+
glEnable(GL_SCISSOR_TEST);
glaDefine2DArea(&rect);
@@ -279,6 +324,7 @@ static void renderwin_draw(RenderWin *rw, int just_clear)
glPixelZoom(1.0, 1.0);
}
+ /* info text is overlayed on bottom */
if (rw->info_text) {
float w;
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
@@ -291,7 +337,7 @@ static void renderwin_draw(RenderWin *rw, int just_clear)
glRasterPos2i(10, 10);
BMF_DrawString(G.font, rw->info_text);
}
-
+
window_swap_buffers(rw->win);
}
@@ -330,6 +376,7 @@ static void renderwin_mouse_moved(RenderWin *rw)
int w, h;
window_get_size(rw->win, &w, &h);
+ h-= RW_HEADERY;
renderwin_win_to_ndc(rw, rw->lmouse, ndc);
rw->zoomofs[0]= -0.5*ndc[0]*(w-R.rectx*rw->zoom)/rw->zoom;
@@ -370,6 +417,13 @@ static void renderwin_handler(Window *win, void *user_data, short evt, short val
{
RenderWin *rw= user_data;
+ // added this for safety, while render it's just creating bezerk results
+ if(R.flag & R_RENDERING) {
+ if(evt==ESCKEY && val)
+ rw->flags|= RW_FLAGS_ESCAPE;
+ return;
+ }
+
if (evt==RESHAPE) {
renderwin_reshape(rw);
}
@@ -492,7 +546,7 @@ static void open_renderwin(int winpos[2], int winsize[2])
char *title;
title= renderwin_get_title(0); /* 0 = no swap */
- win= window_open(title, winpos[0], winpos[1], winsize[0], winsize[1], 0);
+ win= window_open(title, winpos[0], winpos[1], winsize[0], winsize[1]+RW_HEADERY, 0);
render_win= renderwin_alloc(win);
@@ -504,7 +558,7 @@ static void open_renderwin(int winpos[2], int winsize[2])
winlay_process_events(0);
/* mywindow has to know about it too */
- mywindow_build_and_set_renderwin(winpos[0], winpos[1], winsize[0], winsize[1]);
+ mywindow_build_and_set_renderwin(winpos[0], winpos[1], winsize[0], winsize[1]+RW_HEADERY);
/* and we should be able to draw 3d in it */
init_gl_stuff();
@@ -561,7 +615,7 @@ static void renderwin_init_display_cb(void)
if (G.afbreek == 0) {
int rendersize[2], renderpos[2];
- calc_renderwin_rectangle(R.winpos, renderpos, rendersize);
+ calc_renderwin_rectangle(G.winpos, renderpos, rendersize);
if (!render_win) {
open_renderwin(renderpos, rendersize);
@@ -572,6 +626,7 @@ static void renderwin_init_display_cb(void)
window_get_position(render_win->win, &win_x, &win_y);
window_get_size(render_win->win, &win_w, &win_h);
+ win_h-= RW_HEADERY;
/* XXX, this is nasty and I guess bound to cause problems,
* but to ensure the window is at the user specified position
@@ -616,7 +671,9 @@ static void renderwin_clear_display_cb(short ignore)
* ... better is to make this an optimization of a more clear
* implementation. the bug shows up when you do something like
* open the window, then draw part of the progress, then get
-* a redraw event. whatever can go wrong will.
+* a redraw event. whatever can go wrong will. -zr
+*
+* Note: blocked queue handling while rendering to prevent that (ton)
*/
/* in render window; display a couple of scanlines of rendered image (see callback below) */
@@ -627,9 +684,12 @@ static void renderwin_progress(RenderWin *rw, int start_y, int nlines, int rect_
win_rct.xmin= win_rct.ymin= 0;
window_get_size(rw->win, &win_rct.xmax, &win_rct.ymax);
+ win_rct.ymax-= RW_HEADERY;
+
renderwin_get_disprect(rw, disprect);
-
- window_make_active(rw->win);
+
+ /* for efficiency & speed; not drawing in Blender UI while rendering */
+ //window_make_active(rw->win);
glEnable(GL_SCISSOR_TEST);
glaDefine2DArea(&win_rct);
@@ -717,29 +777,87 @@ static void renderview_progress_display_cb(int y1, int y2, int w, int h, unsigne
}
}
+/* in 3d view; display stats of rendered image */
+static void renderview_draw_render_info(char *str)
+{
+ if (render_view3d) {
+ View3D *v3d= render_view3d;
+ rcti vb, win_rct;
+
+ calc_viewborder(v3d, &vb);
+
+ bwin_get_rect(v3d->area->win, &win_rct);
+ glaDefine2DArea(&win_rct);
+
+ glDrawBuffer(GL_FRONT);
+
+ /* clear header rect */
+ BIF_ThemeColor(TH_HEADER);
+ glRecti(vb.xmin, vb.ymax, vb.xmax, vb.ymax+RW_HEADERY);
+
+ if(str) {
+ BIF_ThemeColor(TH_TEXT);
+ glRasterPos2i(vb.xmin+12, vb.ymax+5);
+ BMF_DrawString(G.fonts, str);
+ }
+
+ glFlush();
+ glDrawBuffer(GL_BACK);
+
+ v3d->area->win_swap= WIN_FRONT_OK;
+
+ }
+}
+
+
/* -------------- callbacks for render loop: interactivity ----------------------- */
-/* callback for print info in top header in interface */
+/* callback for print info in top header of renderwin */
+/* time is only not zero on last call, we then don't update the other stats */
static void printrenderinfo_cb(double time, int sample)
{
extern int mem_in_use;
- extern char info_time_str[32]; // header_info.c
- float megs_used_memory= mem_in_use/(1024.0*1024.0);
+ static int totvert=0, totvlak=0, tothalo=0, totlamp=0;
+ static float megs_used_memory=0.0;
char str[300], *spos= str;
- timestr(time, info_time_str);
- spos+= sprintf(spos, "RENDER Fra:%d Ve:%d Fa:%d La:%d", (G.scene->r.cfra), R.totvert, R.totvlak, R.totlamp);
- spos+= sprintf(spos, "Mem:%.2fM Time:%s ", megs_used_memory, info_time_str);
-
- if (R.r.mode & R_FIELDS) {
- spos+= sprintf(spos, "Field %c ", (R.flag&R_SEC_FIELD)?'B':'A');
+ if(time==0.0) {
+ megs_used_memory= mem_in_use/(1024.0*1024.0);
+ totvert= R.totvert;
+ totvlak= R.totvlak;
+ totlamp= R.totlamp;
+ tothalo= R.tothalo;
+ }
+
+ if(tothalo)
+ spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d Ha:%d La:%d Mem:%.2fM", (G.scene->r.cfra), totvert, totvlak, tothalo, totlamp, megs_used_memory);
+ else
+ spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d La:%d Mem:%.2fM", (G.scene->r.cfra), totvert, totvlak, totlamp, megs_used_memory);
+
+ if(time==0.0) {
+ if (R.r.mode & R_FIELDS) {
+ spos+= sprintf(spos, "Field %c ", (R.flag&R_SEC_FIELD)?'B':'A');
+ }
+ if (sample!=-1) {
+ spos+= sprintf(spos, "Sample: %d ", sample);
+ }
}
- if (sample!=-1) {
- spos+= sprintf(spos, "Sample: %d ", sample);
+ else {
+ extern char info_time_str[32]; // header_info.c
+ timestr(time, info_time_str);
+ spos+= sprintf(spos, " Time:%s ", info_time_str);
}
- screen_draw_info_text(G.curscreen, str);
+ if(render_win) {
+ if(render_win->render_text) MEM_freeN(render_win->render_text);
+ render_win->render_text= BLI_strdup(str);
+ glDrawBuffer(GL_FRONT);
+ renderwin_draw_render_info(render_win);
+ glFlush();
+ glDrawBuffer(GL_BACK);
+ }
+ else renderview_draw_render_info(str);
}
/* -------------- callback system to allow ESC from rendering ----------------------- */
@@ -854,7 +972,7 @@ static void do_render(View3D *ogl_render_view3d, int anim, int force_dispwin)
/* we set this flag to prevent renderwindow queue to execute another render */
R.flag= R_RENDERING;
- if (R.displaymode == R_DISPLAYWIN || force_dispwin) {
+ if (G.displaymode == R_DISPLAYWIN || force_dispwin) {
RE_set_initrenderdisplay_callback(NULL);
RE_set_clearrenderdisplay_callback(renderwin_clear_display_cb);
RE_set_renderdisplay_callback(renderwin_progress_display_cb);
@@ -895,10 +1013,8 @@ static void do_render(View3D *ogl_render_view3d, int anim, int force_dispwin)
}
if(anim) update_for_newframe_muted(); // only when anim, causes redraw event which frustrates dispview
- R.flag= 0;
if (render_win) window_set_cursor(render_win->win, CURSOR_STD);
- waitcursor(0);
free_filesel_spec(G.scene->r.pic);
@@ -907,8 +1023,18 @@ static void do_render(View3D *ogl_render_view3d, int anim, int force_dispwin)
/* in dispiew it will destroy the image otherwise
window_make_active() raises window at osx and sends redraws */
- if(R.displaymode==R_DISPLAYWIN) mainwindow_make_active();
-
+ if(G.displaymode==R_DISPLAYWIN) {
+ mainwindow_make_active();
+
+ /* after an envmap creation... */
+ if(R.flag & R_REDRAW_PRV) {
+ BIF_all_preview_changed();
+ }
+ allqueue(REDRAWBUTSSCENE, 0); // visualize fbuf for example
+ }
+
+ R.flag= 0;
+ waitcursor(0); // waitcursor checks rendering R.flag...
}
/* finds area with a 'dispview' set */
@@ -986,6 +1112,22 @@ void BIF_do_ogl_render(View3D *ogl_render_view3d, int anim)
G.scene->r.scemode &= ~R_OGL;
}
+void BIF_redraw_render_rect(void)
+{
+
+ /* redraw */
+ if (G.displaymode == R_DISPLAYWIN) {
+ // don't open render_win if rendering has been
+ // canceled or the render_win has been actively closed
+ if (render_win) {
+ renderwin_queue_redraw(render_win);
+ }
+ } else {
+ renderview_init_display_cb();
+ renderview_progress_display_cb(0, R.recty-1, R.rectx, R.recty, R.rectot);
+ }
+}
+
void BIF_swap_render_rects(void)
{
unsigned int *temp;
@@ -1009,19 +1151,20 @@ void BIF_swap_render_rects(void)
temp= R.rectot;
R.rectot= R.rectspare;
R.rectspare= temp;
-
- /* redraw */
- if (R.displaymode == R_DISPLAYWIN) {
- // don't open render_win if rendering has been
- // canceled or the render_win has been actively closed
+
+ if (G.displaymode == R_DISPLAYWIN) {
if (render_win) {
+ char *tmp= render_win->render_text_spare;
+ render_win->render_text_spare= render_win->render_text;
+ render_win->render_text= tmp;
+
window_set_title(render_win->win, renderwin_get_title(1));
- renderwin_queue_redraw(render_win);
+
}
- } else {
- renderview_init_display_cb();
- renderview_progress_display_cb(0, R.recty-1, R.rectx, R.recty, R.rectot);
}
+
+ /* redraw */
+ BIF_redraw_render_rect();
}
/* called from usiblender.c too, to free and close renderwin */
@@ -1030,6 +1173,8 @@ void BIF_close_render_display(void)
if (render_win) {
if (render_win->info_text) MEM_freeN(render_win->info_text);
+ if (render_win->render_text) MEM_freeN(render_win->render_text);
+ if (render_win->render_text_spare) MEM_freeN(render_win->render_text_spare);
window_destroy(render_win->win); /* ghost close window */
MEM_freeN(render_win);
@@ -1045,7 +1190,7 @@ void BIF_toggle_render_display(void)
ScrArea *sa= find_dispimage_v3d();
if(R.rectot==NULL); // do nothing
- else if (render_win && R.displaymode==R_DISPLAYWIN) {
+ else if (render_win && G.displaymode==R_DISPLAYWIN) {
if(render_win->active) {
mainwindow_raise();
mainwindow_make_active();
@@ -1057,13 +1202,13 @@ void BIF_toggle_render_display(void)
render_win->active= 1;
}
}
- else if (sa && R.displaymode==R_DISPLAYVIEW) {
+ else if (sa && G.displaymode==R_DISPLAYVIEW) {
View3D *vd= sa->spacedata.first;
vd->flag &= ~V3D_DISPIMAGE;
scrarea_queue_winredraw(sa);
}
else {
- if (R.displaymode == R_DISPLAYWIN) {
+ if (G.displaymode == R_DISPLAYWIN) {
renderwin_init_display_cb();
} else {
if (render_win) {
diff --git a/source/blender/src/resources.c b/source/blender/src/resources.c
index 4bef0da4d07..ead7577b0d0 100644
--- a/source/blender/src/resources.c
+++ b/source/blender/src/resources.c
@@ -52,6 +52,8 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
+#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
#include "BIF_resources.h"
diff --git a/source/blender/src/screendump.c b/source/blender/src/screendump.c
index 114be17afa3..7e54791dbd2 100644
--- a/source/blender/src/screendump.c
+++ b/source/blender/src/screendump.c
@@ -48,6 +48,7 @@
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
+#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -65,7 +66,6 @@
#include "BSE_filesel.h"
-#include "render.h"
#include "mydevice.h"
static unsigned int *dumprect=0;
diff --git a/source/blender/src/seqaudio.c b/source/blender/src/seqaudio.c
index 4c6ca1a2226..6f7eede12e2 100644
--- a/source/blender/src/seqaudio.c
+++ b/source/blender/src/seqaudio.c
@@ -82,7 +82,7 @@
#include "mydevice.h"
#include "blendef.h"
-#include "render.h"
+#include "render.h" // RE_make_existing_file()
void audio_fill(void *mixdown, Uint8 *sstream, int len);
diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c
index d7b8f6c22ad..e30edf6b874 100644
--- a/source/blender/src/sequence.c
+++ b/source/blender/src/sequence.c
@@ -74,7 +74,7 @@
#include "BSE_sequence.h"
#include "blendef.h"
-#include "render.h"
+#include "render.h" // talks to entire render API, and igamtab
Sequence *seq_arr[MAXSEQ+1];
int seqrectx, seqrecty;
@@ -628,7 +628,6 @@ void do_cross_effect(float facf0, float facf1, int x, int y, unsigned int *rect1
void do_gammacross_effect(float facf0, float facf1, int x, int y, unsigned int *rect1, unsigned int *rect2, unsigned int *out)
{
-/* extern unsigned short *igamtab1, *gamtab; render.h */
int fac1, fac2, col;
int xo;
char *rt1, *rt2, *rt;
@@ -1949,11 +1948,11 @@ void do_build_seqar_cfra(ListBase *seqbase, Sequence ***seqar, int cfra)
oldcfra= CFRA; CFRA= seq->sfra + se->nr;
waitcursor(1);
- rectot= R.rectot; R.rectot= 0;
+ rectot= R.rectot; R.rectot= NULL;
oldx= R.rectx; oldy= R.recty;
/* needed because current 3D window cannot define the layers, like in a background render */
vd= G.vd;
- G.vd= 0;
+ G.vd= NULL;
RE_initrender(NULL);
if (!G.background) {
@@ -1970,7 +1969,7 @@ void do_build_seqar_cfra(ListBase *seqbase, Sequence ***seqar, int cfra)
se->ibuf->zbuf= (int *)R.rectz;
/* make sure ibuf frees it */
se->ibuf->mall |= IB_zbuf;
- R.rectz= 0;
+ R.rectz= NULL;
}
/* and restore */
diff --git a/source/blender/src/toets.c b/source/blender/src/toets.c
index dcef102e54c..fd9a35df17a 100644
--- a/source/blender/src/toets.c
+++ b/source/blender/src/toets.c
@@ -97,7 +97,7 @@
#include "BSE_headerbuttons.h"
#include "blendef.h"
-#include "render.h"
+#include "render.h" // darn schrijfplaatje() (ton)
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -106,7 +106,7 @@
#include "BIF_poseobject.h"
-/* only used in toets.c */
+/* only used in toets.c and initrender.c */
/* this function doesn't really belong here */
/* ripped from render module */
void schrijfplaatje(char *name);
diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c
index 48d6919da7b..aac377af9f9 100644
--- a/source/blender/src/toolbox.c
+++ b/source/blender/src/toolbox.c
@@ -109,7 +109,7 @@
#include "mydevice.h"
#include "blendef.h"
-#include "render.h"
+#include "render.h" // R.flag
static int tbx1, tbx2, tby1, tby2, tbfontyofs, tbmain=0;
static int tbmemx=TBOXX/2, tbmemy=(TBOXEL-0.5)*TBOXH, tboldwin, addmode= 0;
diff --git a/source/blender/src/usiblender.c b/source/blender/src/usiblender.c
index 9bc8a1a152a..43fd434ebf2 100644
--- a/source/blender/src/usiblender.c
+++ b/source/blender/src/usiblender.c
@@ -116,7 +116,7 @@
#include "blendef.h"
#include "radio.h"
-#include "render.h"
+#include "render.h" // RE_ free stuff
#include "datatoc.h"
#include "SYS_System.h"
@@ -616,7 +616,6 @@ void exit_usiblender(void)
#endif
RE_free_render_data();
- RE_free_filt_mask();
free_txt_data();
diff --git a/source/blender/src/view.c b/source/blender/src/view.c
index cc4fd82bc2f..f809d9bde1b 100644
--- a/source/blender/src/view.c
+++ b/source/blender/src/view.c
@@ -81,7 +81,7 @@
#include "blendef.h"
/* Modules used */
-#include "render.h"
+#include "render.h" /* R. stuff for ogl view render */
#define TRACKBALLSIZE (1.1)
#define BL_NEAR_CLIP 0.001
diff --git a/source/blender/src/writeavicodec.c b/source/blender/src/writeavicodec.c
index 582b1e6503f..d832e4bdc68 100644
--- a/source/blender/src/writeavicodec.c
+++ b/source/blender/src/writeavicodec.c
@@ -53,7 +53,7 @@
#include "DNA_userdef_types.h"
#include "render_types.h"
-#include "render.h"
+#include "render.h" // lotsof R. stuff
#include "BKE_global.h"
#include "BKE_scene.h"
diff --git a/source/blender/src/writeimage.c b/source/blender/src/writeimage.c
index c4dde911d49..75b215f70bd 100644
--- a/source/blender/src/writeimage.c
+++ b/source/blender/src/writeimage.c
@@ -42,7 +42,7 @@
#include "BIF_writeimage.h"
-#include "render.h" // RE_make_existing_file
+#include "render.h" // RE_make_existing_file, R. stuff
#ifdef HAVE_CONFIG_H
#include <config.h>
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp
index 6a3f9493b01..43b4f6298e9 100755
--- a/source/blender/yafray/intern/export_File.cpp
+++ b/source/blender/yafray/intern/export_File.cpp
@@ -1032,7 +1032,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
// Export orco coords test.
// Previously was done by checking orco pointer, however this can be non-null but still not initialized.
// Test the rendermaterial texco flag instead.
- bool EXPORT_ORCO = ((face0mat->ren->texco & TEXCO_ORCO)!=0);
+ bool EXPORT_ORCO = ((face0mat->texco & TEXCO_ORCO)!=0);
string has_orco = "off";
if (EXPORT_ORCO) has_orco = "on";
diff --git a/source/blender/yafray/intern/export_Plugin.cpp b/source/blender/yafray/intern/export_Plugin.cpp
index 9310abfa4d6..5463016ea65 100644
--- a/source/blender/yafray/intern/export_Plugin.cpp
+++ b/source/blender/yafray/intern/export_Plugin.cpp
@@ -1167,7 +1167,7 @@ void yafrayPluginRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_
// Export orco coords test.
// Previously was done by checking orco pointer, however this can be non-null but still not initialized.
// Test the rendermaterial texco flag instead.
- bool has_orco = ((face0mat->ren->texco & TEXCO_ORCO)!=0);
+ bool has_orco = ((face0mat->texco & TEXCO_ORCO)!=0);
bool no_auto = true; //in case non-mesh, or mesh has no autosmooth
float sm_angle = 0.1f;
diff --git a/source/creator/creator.c b/source/creator/creator.c
index e7d7e815566..1b6ceb8f6dd 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -359,7 +359,7 @@ int main(int argc, char **argv)
/* background render uses this font too */
BKE_font_register_builtin(datatoc_Bfont, datatoc_Bfont_size);
- /* must be called here because R.winpos from default file */
+ /* init struct R, Osa, defmaterial, filters */
RE_init_render_data();
if(G.background==0) {
@@ -471,8 +471,6 @@ int main(int argc, char **argv)
*/
BPY_post_start_python();
- RE_init_filt_mask();
-
#ifdef WITH_QUICKTIME
quicktime_init();