This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/render/intern/source/renderdatabase.c
Kent Mein d0e346d544 updated .c files to include:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

Just need to finish cpp files now :)

Kent
--
mein@cs.umn.edu
2002-11-25 12:02:15 +00:00

253 lines
5.9 KiB
C

/**
* $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"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
/* ------------------------------------------------------------------------- */
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;
}
/* ------------------------------------------------------------------------- */