X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fxonotic.git;a=blobdiff_plain;f=misc%2Ftools%2Ffft-normalmap-to-heightmap.c;h=88ac27c9fde1e4288d3907f198669c0b06a6491a;hp=7b72fcbd8808a4678ed1e868e5ed1bbf8a3c0ecc;hb=97fe16d7d3bf7c97873cc5ef52730fee817a6f72;hpb=85dfd7134e95b1a66c0720b34ed0a13cecb8ffee diff --git a/misc/tools/fft-normalmap-to-heightmap.c b/misc/tools/fft-normalmap-to-heightmap.c index 7b72fcbd..88ac27c9 100644 --- a/misc/tools/fft-normalmap-to-heightmap.c +++ b/misc/tools/fft-normalmap-to-heightmap.c @@ -74,9 +74,9 @@ void nmap_to_hmap(unsigned char *map, const unsigned char *refmap, int w, int h, imgspace1[(w*y+x)] = nx / nz * w; /* = dz/dx */ imgspace2[(w*y+x)] = -ny / nz * h; /* = dz/dy */ #else - imgspace1[(w*y+x)][0] = nx / nz; /* = dz/dx */ + imgspace1[(w*y+x)][0] = nx / nz * w; /* = dz/dx */ imgspace1[(w*y+x)][1] = 0; - imgspace2[(w*y+x)][0] = -ny / nz; /* = dz/dy */ + imgspace2[(w*y+x)][0] = -ny / nz * h; /* = dz/dy */ imgspace2[(w*y+x)][1] = 0; #endif } @@ -122,7 +122,32 @@ void nmap_to_hmap(unsigned char *map, const unsigned char *refmap, int w, int h, else freqspace1[(w*y+x)] = 0; #else - // not yet implemented + fftw_complex response_x = {0, 0}; + fftw_complex response_y = {0, 0}; + double sum; + for(i = -filterh / 2; i <= filterh / 2; ++i) + for(j = -filterw / 2; j <= filterw / 2; ++j) + { + response_x[0] += filter[(i + filterh / 2) * filterw + j + filterw / 2] * cos(-TWO_PI * (j * fx + i * fy)); + response_x[1] += filter[(i + filterh / 2) * filterw + j + filterw / 2] * sin(-TWO_PI * (j * fx + i * fy)); + response_y[0] += filter[(i + filterh / 2) * filterw + j + filterw / 2] * cos(-TWO_PI * (i * fx + j * fy)); + response_y[1] += filter[(i + filterh / 2) * filterw + j + filterw / 2] * sin(-TWO_PI * (i * fx + j * fy)); + } + + sum = response_x[0] * response_x[0] + response_x[1] * response_x[1] + + response_y[0] * response_y[0] + response_y[1] * response_y[1]; + + if(sum > 0) + { + double s = freqspace1[(w*y+x)][0]; + freqspace1[(w*y+x)][0] = (response_x[0] * s + response_x[1] * freqspace1[(w*y+x)][1] + response_y[0] * freqspace2[(w*y+x)][0] + response_y[1] * freqspace2[(w*y+x)][1]) / sum; + freqspace1[(w*y+x)][1] = (response_x[0] * freqspace1[(w*y+x)][1] - response_x[1] * s + response_y[0] * freqspace2[(w*y+x)][1] - response_y[1] * freqspace2[(w*y+x)][0]) / sum; + } + else + { + freqspace1[(w*y+x)][0] = 0; + freqspace1[(w*y+x)][1] = 0; + } #endif } else @@ -168,7 +193,8 @@ void nmap_to_hmap(unsigned char *map, const unsigned char *refmap, int w, int h, v = creal(imgspace1[(w*y+x)] /= pow(w*h, 1.5)); #else v = (imgspace1[(w*y+x)][0] /= pow(w*h, 1.5)); - imgspace1[(w*y+x)][1] /= pow(w*h, 1.5); + // imgspace1[(w*y+x)][1] /= pow(w*h, 1.5); + // this value is never used #endif if(v < vmin || (x == 0 && y == 0)) vmin = v;