X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=tools%2Fquake2%2Fqdata_heretic2%2Fsvdcmp.c;h=63811395b22d0b6c35047c3b631c3c59966d2769;hp=e4496a19d77bed4a27e4b765b9d12498759c92df;hb=7fc621fc78d0e040dc2c12f38dc53dd9048215dc;hpb=99980506540d9546dad31223a6eadf126ba68121 diff --git a/tools/quake2/qdata_heretic2/svdcmp.c b/tools/quake2/qdata_heretic2/svdcmp.c index e4496a19..63811395 100644 --- a/tools/quake2/qdata_heretic2/svdcmp.c +++ b/tools/quake2/qdata_heretic2/svdcmp.c @@ -1,23 +1,23 @@ /* -Copyright (C) 1999-2007 id Software, Inc. and contributors. -For a list of contributors, see the accompanying CONTRIBUTORS file. + Copyright (C) 1999-2006 Id Software, Inc. and contributors. + For a list of contributors, see the accompanying CONTRIBUTORS file. -This file is part of GtkRadiant. + This file is part of GtkRadiant. -GtkRadiant 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. + GtkRadiant 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. -GtkRadiant 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. + GtkRadiant 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 GtkRadiant; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + You should have received a copy of the GNU General Public License + along with GtkRadiant; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #include #include @@ -26,262 +26,262 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include static double at,bt,ct; -#define PYTHAG(a,b) ((at=fabs(a)) > (bt=fabs(b)) ? \ - (ct=bt/at,at*sqrt(1.0+ct*ct)) : (bt ? (ct=at/bt,bt*sqrt(1.0+ct*ct)): 0.0)) - - static double maxarg1,maxarg2; -#define MAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\ - (maxarg1) : (maxarg2)) -#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) - -void ntrerror(char *s) -{ - printf("%s\n",s); - exit(1); +#define PYTHAG( a,b ) ( ( at = fabs( a ) ) > ( bt = fabs( b ) ) ? \ + ( ct = bt / at,at * sqrt( 1.0 + ct * ct ) ) : ( bt ? ( ct = at / bt,bt * sqrt( 1.0 + ct * ct ) ) : 0.0 ) ) + +static double maxarg1,maxarg2; +#define MAX( a,b ) ( maxarg1 = ( a ),maxarg2 = ( b ),( maxarg1 ) > ( maxarg2 ) ? \ + ( maxarg1 ) : ( maxarg2 ) ) +#define SIGN( a,b ) ( ( b ) >= 0.0 ? fabs( a ) : -fabs( a ) ) + +void ntrerror( char *s ){ + printf( "%s\n",s ); + exit( 1 ); } -double *allocVect(int sz) -{ +double *allocVect( int sz ){ double *ret; - - ret = calloc(sizeof(double), (size_t)sz); + + ret = calloc( sizeof( double ), (size_t)sz ); return ret; } -void freeVect(double *ret) -{ - free(ret); +void freeVect( double *ret ){ + free( ret ); } -double **allocMatrix(int r,int c) -{ +double **allocMatrix( int r,int c ){ double **ret; - - ret = calloc(sizeof(double), (size_t)(r*c)); + + ret = calloc( sizeof( double ), (size_t)( r * c ) ); return ret; } -void freeMatrix(double **ret,int r) -{ - free(ret); +void freeMatrix( double **ret,int r ){ + free( ret ); } -void svdcmp(double** a, int m, int n, double* w, double** v) -{ - int flag,i,its,j,jj,k,l,nm; - double c,f,h,s,x,y,z; - double anorm=0.0,g=0.0,scale=0.0; - double *rv1; - void nrerror(); - - if (m < n) ntrerror("SVDCMP: You must augment A with extra zero rows"); - rv1=allocVect(n); - for (i=1;i<=n;i++) { - l=i+1; - rv1[i]=scale*g; - g=s=scale=0.0; - if (i <= m) { - for (k=i;k<=m;k++) scale += fabs(a[k][i]); - if (scale) { - for (k=i;k<=m;k++) { - a[k][i] /= scale; - s += a[k][i]*a[k][i]; - } - f=a[i][i]; - g = -SIGN(sqrt(s),f); - h=f*g-s; - a[i][i]=f-g; - if (i != n) { - for (j=l;j<=n;j++) { - for (s=0.0,k=i;k<=m;k++) s += a[k][i]*a[k][j]; - f=s/h; - for (k=i;k<=m;k++) a[k][j] += f*a[k][i]; - } - } - for (k=i;k<=m;k++) a[k][i] *= scale; - } - } - w[i]=scale*g; - g=s=scale=0.0; - if (i <= m && i != n) { - for (k=l;k<=n;k++) scale += fabs(a[i][k]); - if (scale) { - for (k=l;k<=n;k++) { - a[i][k] /= scale; - s += a[i][k]*a[i][k]; - } - f=a[i][l]; - g = -SIGN(sqrt(s),f); - h=f*g-s; - a[i][l]=f-g; - for (k=l;k<=n;k++) rv1[k]=a[i][k]/h; - if (i != m) { - for (j=l;j<=m;j++) { - for (s=0.0,k=l;k<=n;k++) s += a[j][k]*a[i][k]; - for (k=l;k<=n;k++) a[j][k] += s*rv1[k]; - } - } - for (k=l;k<=n;k++) a[i][k] *= scale; - } - } - anorm=MAX(anorm,(fabs(w[i])+fabs(rv1[i]))); - } - for (i=n;i>=1;i--) { - if (i < n) { - if (g) { - for (j=l;j<=n;j++) - v[j][i]=(a[i][j]/a[i][l])/g; - for (j=l;j<=n;j++) { - for (s=0.0,k=l;k<=n;k++) s += a[i][k]*v[k][j]; - for (k=l;k<=n;k++) v[k][j] += s*v[k][i]; - } - } - for (j=l;j<=n;j++) v[i][j]=v[j][i]=0.0; - } - v[i][i]=1.0; - g=rv1[i]; - l=i; - } - for (i=n;i>=1;i--) { - l=i+1; - g=w[i]; - if (i < n) - for (j=l;j<=n;j++) a[i][j]=0.0; - if (g) { - g=1.0/g; - if (i != n) { - for (j=l;j<=n;j++) { - for (s=0.0,k=l;k<=m;k++) s += a[k][i]*a[k][j]; - f=(s/a[i][i])*g; - for (k=i;k<=m;k++) a[k][j] += f*a[k][i]; - } - } - for (j=i;j<=m;j++) a[j][i] *= g; - } else { - for (j=i;j<=m;j++) a[j][i]=0.0; - } - ++a[i][i]; - } - for (k=n;k>=1;k--) { - for (its=1;its<=30;its++) { - flag=1; - for (l=k;l>=1;l--) { - nm=l-1; - if (fabs(rv1[l])+anorm == anorm) { - flag=0; - break; - } - if (fabs(w[nm])+anorm == anorm) break; - } - if (flag) { - c=0.0; - s=1.0; - for (i=l;i<=k;i++) { - f=s*rv1[i]; - if (fabs(f)+anorm != anorm) { - g=w[i]; - h=PYTHAG(f,g); - w[i]=h; - h=1.0/h; - c=g*h; - s=(-f*h); - for (j=1;j<=m;j++) { - y=a[j][nm]; - z=a[j][i]; - a[j][nm]=y*c+z*s; - a[j][i]=z*c-y*s; - } - } +void svdcmp( double** a, int m, int n, double* w, double** v ){ + int flag,i,its,j,jj,k,l,nm; + double c,f,h,s,x,y,z; + double anorm = 0.0,g = 0.0,scale = 0.0; + double *rv1; + void nrerror(); + + if ( m < n ) { + ntrerror( "SVDCMP: You must augment A with extra zero rows" ); } - } - z=w[k]; - if (l == k) { - if (z < 0.0) { - w[k] = -z; - for (j=1;j<=n;j++) v[j][k]=(-v[j][k]); + rv1 = allocVect( n ); + for ( i = 1; i <= n; i++ ) { + l = i + 1; + rv1[i] = scale * g; + g = s = scale = 0.0; + if ( i <= m ) { + for ( k = i; k <= m; k++ ) scale += fabs( a[k][i] ); + if ( scale ) { + for ( k = i; k <= m; k++ ) { + a[k][i] /= scale; + s += a[k][i] * a[k][i]; + } + f = a[i][i]; + g = -SIGN( sqrt( s ),f ); + h = f * g - s; + a[i][i] = f - g; + if ( i != n ) { + for ( j = l; j <= n; j++ ) { + for ( s = 0.0,k = i; k <= m; k++ ) s += a[k][i] * a[k][j]; + f = s / h; + for ( k = i; k <= m; k++ ) a[k][j] += f * a[k][i]; + } + } + for ( k = i; k <= m; k++ ) a[k][i] *= scale; + } + } + w[i] = scale * g; + g = s = scale = 0.0; + if ( i <= m && i != n ) { + for ( k = l; k <= n; k++ ) scale += fabs( a[i][k] ); + if ( scale ) { + for ( k = l; k <= n; k++ ) { + a[i][k] /= scale; + s += a[i][k] * a[i][k]; + } + f = a[i][l]; + g = -SIGN( sqrt( s ),f ); + h = f * g - s; + a[i][l] = f - g; + for ( k = l; k <= n; k++ ) rv1[k] = a[i][k] / h; + if ( i != m ) { + for ( j = l; j <= m; j++ ) { + for ( s = 0.0,k = l; k <= n; k++ ) s += a[j][k] * a[i][k]; + for ( k = l; k <= n; k++ ) a[j][k] += s * rv1[k]; + } + } + for ( k = l; k <= n; k++ ) a[i][k] *= scale; + } + } + anorm = MAX( anorm,( fabs( w[i] ) + fabs( rv1[i] ) ) ); } - break; - } - if (its == 30) ntrerror("No convergence in 30 SVDCMP iterations"); - x=w[l]; - nm=k-1; - y=w[nm]; - g=rv1[nm]; - h=rv1[k]; - f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y); - g=PYTHAG(f,1.0); - f=((x-z)*(x+z)+h*((y/(f+SIGN(g,f)))-h))/x; - c=s=1.0; - for (j=l;j<=nm;j++) { - i=j+1; - g=rv1[i]; - y=w[i]; - h=s*g; - g=c*g; - z=PYTHAG(f,h); - rv1[j]=z; - c=f/z; - s=h/z; - f=x*c+g*s; - g=g*c-x*s; - h=y*s; - y=y*c; - for (jj=1;jj<=n;jj++) { - x=v[jj][j]; - z=v[jj][i]; - v[jj][j]=x*c+z*s; - v[jj][i]=z*c-x*s; + for ( i = n; i >= 1; i-- ) { + if ( i < n ) { + if ( g ) { + for ( j = l; j <= n; j++ ) + v[j][i] = ( a[i][j] / a[i][l] ) / g; + for ( j = l; j <= n; j++ ) { + for ( s = 0.0,k = l; k <= n; k++ ) s += a[i][k] * v[k][j]; + for ( k = l; k <= n; k++ ) v[k][j] += s * v[k][i]; + } + } + for ( j = l; j <= n; j++ ) v[i][j] = v[j][i] = 0.0; + } + v[i][i] = 1.0; + g = rv1[i]; + l = i; } - z=PYTHAG(f,h); - w[j]=z; - if (z) { - z=1.0/z; - c=f*z; - s=h*z; + for ( i = n; i >= 1; i-- ) { + l = i + 1; + g = w[i]; + if ( i < n ) { + for ( j = l; j <= n; j++ ) a[i][j] = 0.0; + } + if ( g ) { + g = 1.0 / g; + if ( i != n ) { + for ( j = l; j <= n; j++ ) { + for ( s = 0.0,k = l; k <= m; k++ ) s += a[k][i] * a[k][j]; + f = ( s / a[i][i] ) * g; + for ( k = i; k <= m; k++ ) a[k][j] += f * a[k][i]; + } + } + for ( j = i; j <= m; j++ ) a[j][i] *= g; + } + else { + for ( j = i; j <= m; j++ ) a[j][i] = 0.0; + } + ++a[i][i]; } - f=(c*g)+(s*y); - x=(c*y)-(s*g); - for (jj=1;jj<=m;jj++) { - y=a[jj][j]; - z=a[jj][i]; - a[jj][j]=y*c+z*s; - a[jj][i]=z*c-y*s; + for ( k = n; k >= 1; k-- ) { + for ( its = 1; its <= 30; its++ ) { + flag = 1; + for ( l = k; l >= 1; l-- ) { + nm = l - 1; + if ( fabs( rv1[l] ) + anorm == anorm ) { + flag = 0; + break; + } + if ( fabs( w[nm] ) + anorm == anorm ) { + break; + } + } + if ( flag ) { + c = 0.0; + s = 1.0; + for ( i = l; i <= k; i++ ) { + f = s * rv1[i]; + if ( fabs( f ) + anorm != anorm ) { + g = w[i]; + h = PYTHAG( f,g ); + w[i] = h; + h = 1.0 / h; + c = g * h; + s = ( -f * h ); + for ( j = 1; j <= m; j++ ) { + y = a[j][nm]; + z = a[j][i]; + a[j][nm] = y * c + z * s; + a[j][i] = z * c - y * s; + } + } + } + } + z = w[k]; + if ( l == k ) { + if ( z < 0.0 ) { + w[k] = -z; + for ( j = 1; j <= n; j++ ) v[j][k] = ( -v[j][k] ); + } + break; + } + if ( its == 30 ) { + ntrerror( "No convergence in 30 SVDCMP iterations" ); + } + x = w[l]; + nm = k - 1; + y = w[nm]; + g = rv1[nm]; + h = rv1[k]; + f = ( ( y - z ) * ( y + z ) + ( g - h ) * ( g + h ) ) / ( 2.0 * h * y ); + g = PYTHAG( f,1.0 ); + f = ( ( x - z ) * ( x + z ) + h * ( ( y / ( f + SIGN( g,f ) ) ) - h ) ) / x; + c = s = 1.0; + for ( j = l; j <= nm; j++ ) { + i = j + 1; + g = rv1[i]; + y = w[i]; + h = s * g; + g = c * g; + z = PYTHAG( f,h ); + rv1[j] = z; + c = f / z; + s = h / z; + f = x * c + g * s; + g = g * c - x * s; + h = y * s; + y = y * c; + for ( jj = 1; jj <= n; jj++ ) { + x = v[jj][j]; + z = v[jj][i]; + v[jj][j] = x * c + z * s; + v[jj][i] = z * c - x * s; + } + z = PYTHAG( f,h ); + w[j] = z; + if ( z ) { + z = 1.0 / z; + c = f * z; + s = h * z; + } + f = ( c * g ) + ( s * y ); + x = ( c * y ) - ( s * g ); + for ( jj = 1; jj <= m; jj++ ) { + y = a[jj][j]; + z = a[jj][i]; + a[jj][j] = y * c + z * s; + a[jj][i] = z * c - y * s; + } + } + rv1[l] = 0.0; + rv1[k] = f; + w[k] = x; + } } - } - rv1[l]=0.0; - rv1[k]=f; - w[k]=x; - } - } - freeVect(rv1); + freeVect( rv1 ); } -void svbksb(double** u, double* w, double** v,int m, int n, double* b, double* x) -{ - int jj,j,i; +void svbksb( double** u, double* w, double** v,int m, int n, double* b, double* x ){ + int jj,j,i; double s,*tmp; - tmp=allocVect(n); - for (j=1;j<=n;j++) - { - s=0.0; - if (w[j]) - { - for (i=1;i<=m;i++) - s += u[i][j]*b[i]; - s /= w[j]; - } - tmp[j]=s; + tmp = allocVect( n ); + for ( j = 1; j <= n; j++ ) + { + s = 0.0; + if ( w[j] ) { + for ( i = 1; i <= m; i++ ) + s += u[i][j] * b[i]; + s /= w[j]; + } + tmp[j] = s; } - for (j=1;j<=n;j++) - { - s=0.0; - for (jj=1;jj<=n;jj++) - s += v[j][jj]*tmp[jj]; - x[j]=s; - } - freeVect(tmp); + for ( j = 1; j <= n; j++ ) + { + s = 0.0; + for ( jj = 1; jj <= n; jj++ ) + s += v[j][jj] * tmp[jj]; + x[j] = s; + } + freeVect( tmp ); } #undef SIGN @@ -290,8 +290,7 @@ void svbksb(double** u, double* w, double** v,int m, int n, double* b, double* x #if 1 -void DOsvd(float *a,float *res,float *comp,float *values,int nframes,int framesize,int compressedsize) -{ +void DOsvd( float *a,float *res,float *comp,float *values,int nframes,int framesize,int compressedsize ){ int usedfs; int *remap; int i,j; @@ -302,46 +301,46 @@ void DOsvd(float *a,float *res,float *comp,float *values,int nframes,int framesi float mx; int bestat; - if (nframes>framesize) - usedfs=nframes; - else - usedfs=framesize; + if ( nframes > framesize ) { + usedfs = nframes; + } + else{ + usedfs = framesize; + } - da=allocMatrix(usedfs,nframes); - v=allocMatrix(nframes,nframes); - w=allocVect(nframes); + da = allocMatrix( usedfs,nframes ); + v = allocMatrix( nframes,nframes ); + w = allocVect( nframes ); DOFerr = 0; //false - for (i=0;imx) - { - mx=(float) fabs(w[i+1]); - bestat=i; + if ( remap[i] < 0 && fabs( w[i + 1] ) > mx ) { + mx = (float) fabs( w[i + 1] ); + bestat = i; } } - if(mx>0) - { - remap[bestat]=j; + if ( mx > 0 ) { + remap[bestat] = j; } else { @@ -349,142 +348,140 @@ void DOsvd(float *a,float *res,float *comp,float *values,int nframes,int framesi } } - if(DOFerr) - { - printf("Warning: To many degrees of freedom! File size may increase\n"); + if ( DOFerr ) { + printf( "Warning: To many degrees of freedom! File size may increase\n" ); - for (i=0;imx) - { - mx=fabs(w[i+1]); - bestat=i; + if ( remap[i] < 0 && fabs( w[i + 1] ) > mx ) { + mx = fabs( w[i + 1] ); + bestat = i; } } - assert(mx>-.5f); - remap[bestat]=j; + assert( mx > -.5f ); + remap[bestat] = j; } // josh **DO NOT** put your dof>nframes mod here - for (i=0;i=3); - base[0]=pnts[0]; - base[1]=pnts[1]; - base[2]=pnts[2]; - for (i=1;i= 3 ); + base[0] = pnts[0]; + base[1] = pnts[1]; + base[2] = pnts[2]; + for ( i = 1; i < npnts; i++ ) { - for (j=0;j<3;j++) - base[j]+=pnts[i*3+j]; + for ( j = 0; j < 3; j++ ) + base[j] += pnts[i * 3 + j]; } - base[0]/=(float)(npnts); - base[1]/=(float)(npnts); - base[2]/=(float)(npnts); + base[0] /= (float)( npnts ); + base[1] /= (float)( npnts ); + base[2] /= (float)( npnts ); - for (i=0;i<3;i++) + for ( i = 0; i < 3; i++ ) { - for (j=0;j