Back to index

radiance  4R0+20100331
Defines | Functions | Variables
noise3.c File Reference
#include "copyright.h"
#include <math.h>
#include "calcomp.h"
#include "func.h"

Go to the source code of this file.

Defines

#define A   0
#define B   1
#define C   2
#define D   3
#define rand3a(x, y, z)   frand(67*(x)+59*(y)+71*(z))
#define rand3b(x, y, z)   frand(73*(x)+79*(y)+83*(z))
#define rand3c(x, y, z)   frand(89*(x)+97*(y)+101*(z))
#define rand3d(x, y, z)   frand(103*(x)+107*(y)+109*(z))
#define hpoly1(t)   ((2.0*t-3.0)*t*t+1.0)
#define hpoly2(t)   (-2.0*t+3.0)*t*t
#define hpoly3(t)   ((t-2.0)*t+1.0)*t
#define hpoly4(t)   (t-1.0)*t*t
#define hermite(p0, p1, r0, r1, t)
#define EPSILON   .001 /* error allowed in fractal */
#define frand3(x, y, z)   frand(17*(x)+23*(y)+29*(z))

Functions

static double l_noise3 (char *nam)
static double l_hermite (char *nm)
static double * noise3 (double xnew[3])
static void interpolate (double f[4], int i, int n)
static double frand (long s)
static double fnoise3 (double p[3])
static double l_noise3 (register char *nam)
void setnoisefuncs (void)
static double * noise3 (register double xnew[3])
static void interpolate (double f[4], register int i, register int n)
static double frand (register long s)

Variables

static const char RCSid [] = "$Id: noise3.c,v 2.10 2006/03/02 17:16:56 greg Exp $"
static char noise_name [4][8] = {"noise3x", "noise3y", "noise3z", "noise3"}
static char fnoise_name [] = "fnoise3"
static char hermite_name [] = "hermite"
static long xlim [3][2]
static double xarg [3]

Define Documentation

#define A   0

Definition at line 18 of file noise3.c.

#define B   1

Definition at line 19 of file noise3.c.

#define C   2

Definition at line 20 of file noise3.c.

#define D   3

Definition at line 21 of file noise3.c.

#define EPSILON   .001 /* error allowed in fractal */

Definition at line 48 of file noise3.c.

#define frand3 (   x,
  y,
  z 
)    frand(17*(x)+23*(y)+29*(z))

Definition at line 50 of file noise3.c.

#define hermite (   p0,
  p1,
  r0,
  r1,
 
)
Value:
(      p0*hpoly1(t) + \
                                   p1*hpoly2(t) + \
                                   r0*hpoly3(t) + \
                                   r1*hpoly4(t) )

Definition at line 33 of file noise3.c.

#define hpoly1 (   t)    ((2.0*t-3.0)*t*t+1.0)

Definition at line 28 of file noise3.c.

#define hpoly2 (   t)    (-2.0*t+3.0)*t*t

Definition at line 29 of file noise3.c.

#define hpoly3 (   t)    ((t-2.0)*t+1.0)*t

Definition at line 30 of file noise3.c.

#define hpoly4 (   t)    (t-1.0)*t*t

Definition at line 31 of file noise3.c.

#define rand3a (   x,
  y,
  z 
)    frand(67*(x)+59*(y)+71*(z))

Definition at line 23 of file noise3.c.

#define rand3b (   x,
  y,
  z 
)    frand(73*(x)+79*(y)+83*(z))

Definition at line 24 of file noise3.c.

#define rand3c (   x,
  y,
  z 
)    frand(89*(x)+97*(y)+101*(z))

Definition at line 25 of file noise3.c.

#define rand3d (   x,
  y,
  z 
)    frand(103*(x)+107*(y)+109*(z))

Definition at line 26 of file noise3.c.


Function Documentation

static double fnoise3 ( double  p[3]) [static]

Definition at line 170 of file noise3.c.

{
       long  t[3], v[3], beg[3];
       double  fval[8], fc;
       int  branch;
       register long  s;
       register int  i, j;
                                          /* get starting cube */
       s = (long)(1.0/EPSILON);
       for (i = 0; i < 3; i++) {
              t[i] = s*p[i];
              beg[i] = s*floor(p[i]);
       }
       for (j = 0; j < 8; j++) {
              for (i = 0; i < 3; i++) {
                     v[i] = beg[i];
                     if (j & 1<<i)
                            v[i] += s;
              }
              fval[j] = frand3(v[0],v[1],v[2]);
       }
                                          /* compute fractal */
       for ( ; ; ) {
              fc = 0.0;
              for (j = 0; j < 8; j++)
                     fc += fval[j];
              fc *= 0.125;
              if ((s >>= 1) == 0)
                     return(fc);          /* close enough */
              branch = 0;
              for (i = 0; i < 3; i++) {   /* do center */
                     v[i] = beg[i] + s;
                     if (t[i] > v[i]) {
                            branch |= 1<<i;
                     }
              }
              fc += s*EPSILON*frand3(v[0],v[1],v[2]);
              fval[~branch & 7] = fc;
              for (i = 0; i < 3; i++) {   /* do faces */
                     if (branch & 1<<i)
                            v[i] += s;
                     else
                            v[i] -= s;
                     fc = 0.0;
                     for (j = 0; j < 8; j++)
                            if (~(j^branch) & 1<<i)
                                   fc += fval[j];
                     fc = 0.25*fc + s*EPSILON*frand3(v[0],v[1],v[2]);
                     fval[~(branch^1<<i) & 7] = fc;
                     v[i] = beg[i] + s;
              }
              for (i = 0; i < 3; i++) {   /* do edges */
                     if ((j = i+1) == 3) j = 0;
                     if (branch & 1<<j)
                            v[j] += s;
                     else
                            v[j] -= s;
                     if (++j == 3) j = 0;
                     if (branch & 1<<j)
                            v[j] += s;
                     else
                            v[j] -= s;
                     fc = fval[branch & ~(1<<i)];
                     fc += fval[branch | 1<<i];
                     fc = 0.5*fc + s*EPSILON*frand3(v[0],v[1],v[2]);
                     fval[branch^1<<i] = fc;
                     if ((j = i+1) == 3) j = 0;
                     v[j] = beg[j] + s;
                     if (++j == 3) j = 0;
                     v[j] = beg[j] + s;
              }
              for (i = 0; i < 3; i++)            /* new cube */
                     if (branch & 1<<i)
                            beg[i] += s;
       }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static double frand ( long  s) [static]
static double frand ( register long  s) [static]

Definition at line 160 of file noise3.c.

{
       s = s<<13 ^ s;
       return(1.0-((s*(s*s*15731+789221)+1376312589)&0x7fffffff)/1073741824.0);
}
static void interpolate ( double  f[4],
int  i,
int  n 
) [static]
static void interpolate ( double  f[4],
register int  i,
register int  n 
) [static]

Definition at line 132 of file noise3.c.

{
       double  f0[4], f1[4], hp1, hp2;

       if (n == 0) {
              f[A] = rand3a(xlim[0][i&1],xlim[1][i>>1&1],xlim[2][i>>2]);
              f[B] = rand3b(xlim[0][i&1],xlim[1][i>>1&1],xlim[2][i>>2]);
              f[C] = rand3c(xlim[0][i&1],xlim[1][i>>1&1],xlim[2][i>>2]);
              f[D] = rand3d(xlim[0][i&1],xlim[1][i>>1&1],xlim[2][i>>2]);
       } else {
              n--;
              interpolate(f0, i, n);
              interpolate(f1, i | 1<<n, n);
              hp1 = hpoly1(xarg[n]); hp2 = hpoly2(xarg[n]);
              f[A] = f0[A]*hp1 + f1[A]*hp2;
              f[B] = f0[B]*hp1 + f1[B]*hp2;
              f[C] = f0[C]*hp1 + f1[C]*hp2;
              f[D] = f0[D]*hp1 + f1[D]*hp2 +
                            f0[n]*hpoly3(xarg[n]) + f1[n]*hpoly4(xarg[n]);
       }
}
static double l_hermite ( char *  nm) [static]
static double l_noise3 ( char *  nam) [static]

Here is the caller graph for this function:

static double l_noise3 ( register char *  nam) [static]

Definition at line 61 of file noise3.c.

{
       register int  i;
       double  x[3];
                                   /* get point */
       x[0] = argument(1);
       x[1] = argument(2);
       x[2] = argument(3);
                                   /* make appropriate call */
       if (nam == fnoise_name)
              return(fnoise3(x));
       i = 4;
       while (i--)
              if (nam == noise_name[i])
                     return(noise3(x)[i]);
       eputs(nam);
       eputs(": called l_noise3!\n");
       quit(1);
       return 1; /* pro forma return */
}

Here is the call graph for this function:

static double* noise3 ( double  xnew[3]) [static]

Here is the caller graph for this function:

static double* noise3 ( register double  xnew[3]) [static]

Definition at line 110 of file noise3.c.

{
       static double  x[3] = {-100000.0, -100000.0, -100000.0};
       static double  f[4];

       if (x[0]==xnew[0] && x[1]==xnew[1] && x[2]==xnew[2])
              return(f);
       x[0] = xnew[0]; x[1] = xnew[1]; x[2] = xnew[2];
       xlim[0][0] = floor(x[0]); xlim[0][1] = xlim[0][0] + 1;
       xlim[1][0] = floor(x[1]); xlim[1][1] = xlim[1][0] + 1;
       xlim[2][0] = floor(x[2]); xlim[2][1] = xlim[2][0] + 1;
       xarg[0] = x[0] - xlim[0][0];
       xarg[1] = x[1] - xlim[1][0];
       xarg[2] = x[2] - xlim[2][0];
       interpolate(f, 0, 3);
       return(f);
}

Here is the call graph for this function:

void setnoisefuncs ( void  )

Definition at line 97 of file noise3.c.

{
       register int  i;

       funset(hermite_name, 5, ':', l_hermite);
       funset(fnoise_name, 3, ':', l_noise3);
       i = 4;
       while (i--)
              funset(noise_name[i], 3, ':', l_noise3);
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

char fnoise_name[] = "fnoise3" [static]

Definition at line 39 of file noise3.c.

char hermite_name[] = "hermite" [static]

Definition at line 40 of file noise3.c.

char noise_name[4][8] = {"noise3x", "noise3y", "noise3z", "noise3"} [static]

Definition at line 38 of file noise3.c.

const char RCSid[] = "$Id: noise3.c,v 2.10 2006/03/02 17:16:56 greg Exp $" [static]

Definition at line 2 of file noise3.c.

double xarg[3] [static]

Definition at line 46 of file noise3.c.

long xlim[3][2] [static]

Definition at line 45 of file noise3.c.