diff options
Diffstat (limited to 'source/blender/render/intern/source/renderHelp.c')
-rw-r--r-- | source/blender/render/intern/source/renderHelp.c | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/source/blender/render/intern/source/renderHelp.c b/source/blender/render/intern/source/renderHelp.c new file mode 100644 index 00000000000..c7294d0feeb --- /dev/null +++ b/source/blender/render/intern/source/renderHelp.c @@ -0,0 +1,294 @@ +/** + * + * ***** 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 ***** + * Some helpful conversions/functions. + * + * $Id$ + */ + +#include <math.h> +#include <limits.h> +#include <stdlib.h> + +#include "render.h" +#include "render_intern.h" +#include "renderHelp.h" +#include "zbuf.h" + + + +static float panovco, panovsi; +static float panophi=0.0; +static float tempPanoPhi; + +static int panotestclip(float *v); + +void pushTempPanoPhi(float p) { + tempPanoPhi = panophi; + panophi = p; +} + +void popTempPanoPhi() { + panophi = tempPanoPhi; +} + +float getPanoPhi(){ + return panophi; +} +float getPanovCo(){ + return panovco; +} +float getPanovSi(){ + return panovsi; +} + +void setPanoRot(int part) +{ +/* extern float panovco, panovsi; */ + static float alpha= 1.0; + + /* part==0 alles initialiseren */ + + if(part==0) { + + alpha= ((float)R.r.xsch)/R.viewfac; + alpha= 2.0*atan(alpha/2.0); + } + + + /* we roteren alles om de y-as met phi graden */ + + panophi= -0.5*(R.r.xparts-1)*alpha + part*alpha; + + panovsi= sin(-panophi); + panovco= cos(-panophi); + +} + + + + +static int panotestclip(float *v) +{ + /* gebruiken voor halo's en info's */ + float abs4; + short c=0; + + if((R.r.mode & R_PANORAMA)==0) return RE_testclip(v); + + abs4= fabs(v[3]); + + if(v[2]< -abs4) c=16; /* hier stond vroeger " if(v[2]<0) ", zie clippz() */ + else if(v[2]> abs4) c+= 32; + + if( v[1]>abs4) c+=4; + else if( v[1]< -abs4) c+=8; + + abs4*= R.r.xparts; + if( v[0]>abs4) c+=2; + else if( v[0]< -abs4) c+=1; + + return c; +} + +/* + + This adds the hcs coordinates to vertices. It iterates over all + vertices, halos and faces. After the conversion, we clip in hcs. + + Elsewhere, all primites are converted to vertices. + Called in + - envmapping (envmap.c) + - shadow buffering (shadbuf.c) + - preparation for rendering (renderPreAndPost.c) + +*/ + +/* move to renderer */ +void setzbufvlaggen( void (*projectfunc)(float *, float *) ) +/* ook homoco's */ +{ + VlakRen *vlr = NULL; + VertRen *ver = NULL; + HaloRen *har = NULL; + float zn, vec[3], si, co, hoco[4]; + int a; + float panophi = 0.0; + + panophi = getPanoPhi(); + si= sin(panophi); + co= cos(panophi); + + /* calculate view coordinates (and zbuffer value) */ + for(a=0; a< R.totvert;a++) { + if((a & 255)==0) ver= R.blove[a>>8]; + else ver++; + + if(R.r.mode & R_PANORAMA) { + vec[0]= co*ver->co[0] + si*ver->co[2]; + vec[1]= ver->co[1]; + vec[2]= -si*ver->co[0] + co*ver->co[2]; + } + else { + VECCOPY(vec, ver->co); + } + /* Go from wcs to hcs ... */ + projectfunc(vec, ver->ho); + /* ... and clip in that system. */ + ver->clip = RE_testclip(ver->ho); + /* + Because all other ops are performed in other systems, this is + the only thing that has to be done. + */ + } + + /* calculate view coordinates (and zbuffer value) */ + for(a=0; a<R.tothalo; a++) { + if((a & 255)==0) har= R.bloha[a>>8]; + else har++; + + if(R.r.mode & R_PANORAMA) { + vec[0]= co*har->co[0] + si*har->co[2]; + vec[1]= har->co[1]; + vec[2]= -si*har->co[0] + co*har->co[2]; + } + else { + VECCOPY(vec, har->co); + } + + projectfunc(vec, hoco); + + hoco[3]*= 2.0; + + if( panotestclip(hoco) ) { + har->miny= har->maxy= -10000; /* de render clipt 'm weg */ + } + else if(hoco[3]<0.0) { + har->miny= har->maxy= -10000; /* de render clipt 'm weg */ + } + else /* this seems to be strange code here...*/ + { + zn= hoco[3]/2.0; + har->xs= 0.5*R.rectx*(1.0+hoco[0]/zn); /* the 0.5 negates the previous 2...*/ + har->ys= 0.5*R.recty*(1.0+hoco[1]/zn); + + /* this should be the zbuffer coordinate */ + har->zs= 0x7FFFFF*(1.0+hoco[2]/zn); + /* taking this from the face clip functions? seems ok... */ + har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn); + vec[0]+= har->hasize; + projectfunc(vec, hoco); + vec[0]-= har->hasize; + zn= hoco[3]; + har->rad= fabs(har->xs- 0.5*R.rectx*(1.0+hoco[0]/zn)); + + /* deze clip is eigenlijk niet OK */ + if(har->type & HA_ONLYSKY) { + if(har->rad>3.0) har->rad= 3.0; + } + + har->radsq= har->rad*har->rad; + + har->miny= har->ys - har->rad/R.ycor; + har->maxy= har->ys + har->rad/R.ycor; + + /* de Zd is bij pano nog steeds verkeerd: zie testfile in blenderbugs/halo+pano.blend */ + + vec[2]-= har->hasize; /* z is negatief, wordt anders geclipt */ + projectfunc(vec, hoco); + zn= hoco[3]; + zn= fabs(har->zs - 0x7FFFFF*(1.0+hoco[2]/zn)); + har->zd= CLAMPIS(zn, 0, INT_MAX); + + /* if( har->zs < 2*har->zd) { */ + /* PRINT2(d, d, har->zs, har->zd); */ + /* har->alfa= har->mat->alpha * ((float)(har->zs))/(float)(2*har->zd); */ + /* } */ + + } + + } + + /* vlaggen op 0 zetten als eruit geclipt */ + for(a=0; a<R.totvlak; a++) { + if((a & 255)==0) vlr= R.blovl[a>>8]; + else vlr++; + + vlr->flag |= R_VISIBLE; + if(vlr->v4) { + if(vlr->v1->clip & vlr->v2->clip & vlr->v3->clip & vlr->v4->clip) vlr->flag &= ~R_VISIBLE; + } + else if(vlr->v1->clip & vlr->v2->clip & vlr->v3->clip) vlr->flag &= ~R_VISIBLE; + + } + +} + +/* ------------------------------------------------------------------------- */ +/* move to renderer */ + +void set_normalflags(void) +{ + VlakRen *vlr = NULL; + float vec[3], xn, yn, zn; + int a1; + + /* KLAP NORMAAL EN SNIJ PROJECTIE */ + for(a1=0; a1<R.totvlak; a1++) { + if((a1 & 255)==0) vlr= R.blovl[a1>>8]; + else vlr++; + + if(vlr->flag & R_NOPUNOFLIP) { + /* render normaal flippen, wel niet zo netjes, maar anders dan moet de render() ook over... */ + vlr->n[0]= -vlr->n[0]; + vlr->n[1]= -vlr->n[1]; + vlr->n[2]= -vlr->n[2]; + } + else { + + vec[0]= vlr->v1->co[0]; + vec[1]= vlr->v1->co[1]; + vec[2]= vlr->v1->co[2]; + + if( (vec[0]*vlr->n[0] +vec[1]*vlr->n[1] +vec[2]*vlr->n[2])<0.0 ) { + vlr->puno= ~(vlr->puno); + vlr->n[0]= -vlr->n[0]; + vlr->n[1]= -vlr->n[1]; + vlr->n[2]= -vlr->n[2]; + } + } + xn= fabs(vlr->n[0]); + yn= fabs(vlr->n[1]); + zn= fabs(vlr->n[2]); + if(zn>=xn && zn>=yn) vlr->snproj= 0; + else if(yn>=xn && yn>=zn) vlr->snproj= 1; + else vlr->snproj= 2; + + } +} |