float turbulence(float x,float y,float z,float pixel_size) { float t, scale, new_point[3]; t = 0; new_point[0] = x; new_point[1] = y; new_point[2] = z; for (scale=1.0; scale>pixel_size; scale/=2.0) { new_point[0] /= scale; new_point[1] /= scale; new_point[2] /= scale; t += calc_noise(new_point[0],new_point[1],2)*scale; } return( t ); }
void Bump_map(float x, float y, float z, float xc, float yc, float zc, float r, float *nx, float *ny , float *nz, int noise_method) { float xp,yp,zp,iu,iv,xu,yu,zu,xv,yv,zv; float fu,fv,a,dx,dy,dz,u,v,nnx,nny,nnz; /*Translate to origin*/ xp = (x - xc)/r; yp = (y - yc)/r; zp = (z - zc)/r; /*convert to (u,v) coordinates*/ u = asin(zp); v = atan2(yp, xp); /*convert to integer (iu,iv) coordinates*/ iu = (u + PI) / (2 * PI) * (TABLE_SIZE_1); iv = (u + 0.5*PI) / PI * (TABLE_SIZE_1); /*get the partials*/ xu = -r * cos(v) * sin(v); xv = -r * sin(v) * cos(u); yu = r * cos(v) * cos(u); yv = -r * sin(v) * sin(u); zu = 0.0; zv = r * cos(v); /*calculate the pertubations*/ fu = calc_noise(iu,iv,1); fv = calc_noise(iu,iv,2); /*compute D*/ if(noise_method == 1) { dx = fu*xu + fv*xv; dy = fu*yu + fv*yv; dz = fu*zu + fv*zv; } else { nnx = *nx; nny = *ny; nnz = *nz; Normalize(&nnx, &nny, &nnz); /*Compute the cross product of Pu * N */ dx = fv*(yu*nnz - nny*zu); dy = fv*(nnx*zu - xu*nnz); dz = fv*(xu*nny - nnx*yu); /*Compute the cross product of Pv * N */ dx += fu*(yv*nnz - nny*zv); dy += fu*(nnx*zv - xv*nnz); dz += fu*(xv*nny - nnx*yv); } /*Normalize and Scale D*/ Normalize(&dx,&dy,&dz); a = sqrt(fu*fu + fv*fv); dx *= a; dy *= a; dz *= a; *nx += dx; *ny += dy; *nz += dz; }
static void set_pinfo ( lame_global_flags *gfp, gr_info * const cod_info, const III_psy_ratio * const ratio, const III_scalefac_t * const scalefac, const int gr, const int ch ) { lame_internal_flags *gfc=gfp->internal_flags; int sfb; int j,i,l,start,end,bw; FLOAT8 en0,en1; FLOAT ifqstep = ( cod_info->scalefac_scale == 0 ) ? .5 : 1.0; III_psy_xmin l3_xmin; calc_noise_result noise; III_psy_xmin xfsf; calc_xmin (gfp, ratio, cod_info, &l3_xmin); calc_noise (gfc, cod_info->l3_enc, cod_info, &l3_xmin, scalefac, &xfsf, &noise); if (cod_info->block_type == SHORT_TYPE) { for (j=0, sfb = 0; sfb < SBMAX_s; sfb++ ) { start = gfc->scalefac_band.s[ sfb ]; end = gfc->scalefac_band.s[ sfb + 1 ]; bw = end - start; for ( i = 0; i < 3; i++ ) { for ( en0 = 0.0, l = start; l < end; l++ ) { en0 += cod_info->xr[j] * cod_info->xr[j]; ++j; } en0=Max(en0/bw,1e-20); #if 0 { double tot1,tot2; if (sfb<SBMAX_s-1) { if (sfb==0) { tot1=0; tot2=0; } tot1 += en0; tot2 += ratio->en.s[sfb][i]; DEBUGF("%i %i sfb=%i mdct=%f fft=%f fft-mdct=%f db \n", gr,ch,sfb, 10*log10(Max(1e-25,ratio->en.s[sfb][i])), 10*log10(Max(1e-25,en0)), 10*log10((Max(1e-25,en0)/Max(1e-25,ratio->en.s[sfb][i])))); if (sfb==SBMAX_s-2) { DEBUGF("%i %i toti %f %f ratio=%f db \n",gr,ch, 10*log10(Max(1e-25,tot2)), 10*log(Max(1e-25,tot1)), 10*log10(Max(1e-25,tot1)/(Max(1e-25,tot2)))); } } /* masking: multiplied by en0/fft_energy average seems to be about -135db. */ } #endif /* convert to MDCT units */ en1=1e15; /* scaling so it shows up on FFT plot */ gfc->pinfo->xfsf_s[gr][ch][3*sfb+i] = en1*xfsf.s[sfb][i]*l3_xmin.s[sfb][i]/bw; gfc->pinfo->en_s[gr][ch][3*sfb+i] = en1*en0; if (ratio->en.s[sfb][i]>0) en0 = en0/ratio->en.s[sfb][i]; else en0=0; if (gfp->ATHonly || gfp->ATHshort) en0=0; gfc->pinfo->thr_s[gr][ch][3*sfb+i] = en1*Max(en0*ratio->thm.s[sfb][i],gfc->ATH->s[sfb]); /* there is no scalefactor bands >= SBPSY_s */ if (sfb < SBPSY_s) { gfc->pinfo->LAMEsfb_s[gr][ch][3*sfb+i]= -ifqstep*scalefac->s[sfb][i]; } else { gfc->pinfo->LAMEsfb_s[gr][ch][3*sfb+i]=0; } gfc->pinfo->LAMEsfb_s[gr][ch][3*sfb+i] -= 2*cod_info->subblock_gain[i]; } } } else { for ( sfb = 0; sfb < SBMAX_l; sfb++ ) { start = gfc->scalefac_band.l[ sfb ]; end = gfc->scalefac_band.l[ sfb+1 ]; bw = end - start; for ( en0 = 0.0, l = start; l < end; l++ ) en0 += cod_info->xr[l] * cod_info->xr[l]; en0/=bw; /* DEBUGF("diff = %f \n",10*log10(Max(ratio[gr][ch].en.l[sfb],1e-20)) -(10*log10(en0)+150)); */ #if 0 { double tot1,tot2; if (sfb==0) { tot1=0; tot2=0; } tot1 += en0; tot2 += ratio->en.l[sfb]; DEBUGF("%i %i sfb=%i mdct=%f fft=%f fft-mdct=%f db \n", gr,ch,sfb, 10*log10(Max(1e-25,ratio->en.l[sfb])), 10*log10(Max(1e-25,en0)), 10*log10((Max(1e-25,en0)/Max(1e-25,ratio->en.l[sfb])))); if (sfb==SBMAX_l-1) { DEBUGF("%i %i toti %f %f ratio=%f db \n", gr,ch, 10*log10(Max(1e-25,tot2)), 10*log(Max(1e-25,tot1)), 10*log10(Max(1e-25,tot1)/(Max(1e-25,tot2)))); } /* masking: multiplied by en0/fft_energy average seems to be about -147db. */ } #endif /* convert to MDCT units */ en1=1e15; /* scaling so it shows up on FFT plot */ gfc->pinfo->xfsf[gr][ch][sfb] = en1*xfsf.l[sfb]*l3_xmin.l[sfb]/bw; gfc->pinfo->en[gr][ch][sfb] = en1*en0; if (ratio->en.l[sfb]>0) en0 = en0/ratio->en.l[sfb]; else en0=0; if (gfp->ATHonly) en0=0; gfc->pinfo->thr[gr][ch][sfb] = en1*Max(en0*ratio->thm.l[sfb],gfc->ATH->l[sfb]); /* there is no scalefactor bands >= SBPSY_l */ if (sfb<SBPSY_l) { if (scalefac->l[sfb]<0) /* scfsi! */ gfc->pinfo->LAMEsfb[gr][ch][sfb] = gfc->pinfo->LAMEsfb[0][ch][sfb]; else gfc->pinfo->LAMEsfb[gr][ch][sfb] = -ifqstep*scalefac->l[sfb]; }else{ gfc->pinfo->LAMEsfb[gr][ch][sfb] = 0; } if (cod_info->preflag && sfb>=11) gfc->pinfo->LAMEsfb[gr][ch][sfb] -= ifqstep*pretab[sfb]; } /* for sfb */ } /* block type long */ gfc->pinfo->LAMEqss [gr][ch] = cod_info->global_gain; gfc->pinfo->LAMEmainbits[gr][ch] = cod_info->part2_3_length; gfc->pinfo->LAMEsfbits [gr][ch] = cod_info->part2_length; gfc->pinfo->over [gr][ch] = noise.over_count; gfc->pinfo->max_noise [gr][ch] = noise.max_noise; gfc->pinfo->over_noise[gr][ch] = noise.over_noise; gfc->pinfo->tot_noise [gr][ch] = noise.tot_noise; }