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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/render/intern/source/renderdatabase.c')
-rw-r--r--source/blender/render/intern/source/renderdatabase.c248
1 files changed, 248 insertions, 0 deletions
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
new file mode 100644
index 00000000000..03b9d117e23
--- /dev/null
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -0,0 +1,248 @@
+/**
+ * $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 *****
+ * Storage, retrieval and query of render specific data.
+ */
+
+/*
+ * All data from a Blender scene is converter by the renderconverter/
+ * into a special format that is used by the render module to make
+ * images out of. These functions interface to the render-specific
+ * database.
+ *
+ * The blo{ha/ve/vl} arrays store pointers to blocks of 256 data
+ * entries each.
+ *
+ * The index of an entry is >>8 (the highest 24 * bits), to find an
+ * offset in a 256-entry block.
+ *
+ * - If the 256-entry block entry has an entry in the
+ * blove/bloha/blovl array of the current block, the i-th entry in
+ * that block is allocated to this entry.
+ *
+ * - If the entry has no block allocated for it yet, memory is
+ * allocated.
+ *
+ * The pointer to the correct entry is returned. Memory is guarateed
+ * to exist (as long as the malloc does not break). Since guarded
+ * allocation is used, memory _must_ be available. Otherwise, an
+ * exit(0) would occur.
+ *
+ */
+
+#include <math.h>
+#include "MEM_guardedalloc.h"
+#include "BLI_arithb.h"
+
+#include "DNA_texture_types.h"
+#include "BKE_texture.h"
+
+#include "render.h"
+#include "render_intern.h"
+
+/* ------------------------------------------------------------------------- */
+
+VertRen *RE_findOrAddVert(int nr)
+{
+ VertRen *v;
+ int a;
+
+ if(nr<0 || nr>MAXVERT ) {
+ printf("error in findOrAddVert: %d\n",nr);
+ return R.blove[0];
+ }
+ a= nr>>8;
+ v= R.blove[a];
+ if(v==0) {
+ v= (VertRen *)MEM_callocN(256*sizeof(VertRen),"findOrAddVert");
+ R.blove[a]= v;
+ }
+ v+= (nr & 255);
+ return v;
+}
+
+/* ------------------------------------------------------------------------ */
+
+HaloRen *RE_findOrAddHalo(int nr)
+{
+ HaloRen *h;
+ int a;
+
+ if(nr<0 || nr>MAXVERT ) {
+ printf("error in findOrAddHalo: %d\n",nr);
+ return R.bloha[0];
+ }
+ a= nr>>8;
+ h= R.bloha[a];
+ if(h==0) {
+ h= (HaloRen *)MEM_callocN(256*sizeof(HaloRen),"findOrAdHalo");
+ R.bloha[a]= h;
+ }
+ h+= (nr & 255);
+ return h;
+}
+
+/* ------------------------------------------------------------------------ */
+
+VlakRen *RE_findOrAddVlak(int nr)
+{
+ VlakRen *v;
+ int a;
+
+ if(nr<0 || nr>MAXVLAK ) {
+ printf("error in findOrAddVlak: %d\n",nr);
+ return R.blovl[0];
+ }
+ a= nr>>8;
+ v= R.blovl[a];
+ if(v==0) {
+ v= (VlakRen *)MEM_callocN(256*sizeof(VlakRen),"findOrAddVlak");
+ R.blovl[a]= v;
+ }
+ v+= (nr & 255);
+ return v;
+}
+
+/* ------------------------------------------------------------------------- */
+
+extern float Tin, Tr, Tg, Tb;
+HaloRen *RE_inithalo(Material *ma,
+ float *vec,
+ float *vec1,
+ float *orco,
+ float hasize,
+ float vectsize)
+{
+ HaloRen *har;
+ MTex *mtex;
+ float xn, yn, zn, texvec[3], hoco[4], hoco1[4];
+
+ if(hasize==0) return 0;
+
+ RE_projectverto(vec, hoco);
+ if(hoco[3]==0.0) return 0;
+ if(vec1) {
+ RE_projectverto(vec1, hoco1);
+ if(hoco1[3]==0.0) return 0;
+ }
+
+ har= RE_findOrAddHalo(R.tothalo++);
+ VECCOPY(har->co, vec);
+ har->hasize= hasize;
+
+ /* projectvert wordt in zbufvlaggen gedaan ivm parts/border/pano */
+
+ /* halovect */
+ if(vec1) {
+
+ har->type |= HA_VECT;
+
+ zn= hoco[3];
+ har->xs= 0.5*R.rectx*(hoco[0]/zn);
+ har->ys= 0.5*R.recty*(hoco[1]/zn);
+ har->zs= 0x7FFFFF*(1.0+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]);
+ if(xn==0.0 || (xn==0.0 && yn==0.0)) zn= 0.0;
+ else zn= atan2(yn, xn);
+
+ har->sin= sin(zn);
+ har->cos= cos(zn);
+ zn= VecLenf(vec1, vec);
+
+ har->hasize= vectsize*zn + (1.0-vectsize)*hasize;
+
+ VecSubf(har->no, vec, vec1);
+ Normalise(har->no);
+ }
+
+ 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->hard= ma->har;
+ har->seed= ma->ren->seed1 % 256;
+
+ if(ma->mode & MA_STAR) har->starpoints= ma->starc;
+ if(ma->mode & MA_HALO_LINES) har->linec= ma->linec;
+ if(ma->mode & MA_HALO_RINGS) har->ringc= ma->ringc;
+ if(ma->mode & MA_HALO_FLARE) har->flarec= ma->flarec;
+
+
+ if(ma->mtex[0]) {
+
+ if( (ma->mode & MA_HALOTEX) ) har->tex= 1;
+ else {
+
+ mtex= ma->mtex[0];
+ VECCOPY(texvec, vec);
+
+ if(mtex->texco & TEXCO_NORM) {
+ ;
+ }
+ else if(mtex->texco & TEXCO_OBJECT) {
+ /* texvec[0]+= imatbase->ivec[0]; */
+ /* texvec[1]+= imatbase->ivec[1]; */
+ /* texvec[2]+= imatbase->ivec[2]; */
+ /* Mat3MulVecfl(imatbase->imat, texvec); */
+ }
+ else {
+ if(orco) {
+ VECCOPY(texvec, orco);
+ }
+ }
+
+ externtex(mtex, texvec);
+
+ 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);
+ }
+ if(mtex->texco & 16) {
+ har->alfa= 255.0*Tin;
+ }
+ }
+ }
+
+ return har;
+}
+/* ------------------------------------------------------------------------- */