// // Created by selim on 07.07.15. // #include "SpectralMesh.h" #include #include #include SpectralMesh::SpectralMesh(ShaderProgram *shader, std::size_t size): Mesh(shader, size) { _data = new float[size*size]; _spectrLine = new float[2*size]; _spectrLineComplex = (fftwf_complex*)fftwf_malloc((_size + 1)*sizeof(fftwf_complex)); } SpectralMesh::~SpectralMesh() { delete[] _data; delete[] _spectrLine; fftwf_free(_spectrLineComplex); } float SpectralMesh::heightMapFunc(std::size_t nx, std::size_t ny, float fx, float fy) const { return *(_data + _size*nx + ny); } void SpectralMesh::addLine(float *line) { for(std::size_t i = 0; i < 2*_size; ++i) { _spectrLine[i] = line[2*i]; } fftwf_plan plan = fftwf_plan_dft_r2c_1d(2*_size, _spectrLine, _spectrLineComplex, FFTW_ESTIMATE); fftwf_execute(plan); for(std::size_t i = 0; i < _size; ++i) { float real = _spectrLineComplex[i][0], imag = _spectrLineComplex[i][1]; _spectrLine[i] = 0.3*log10f(sqrtf(real*real + imag*imag)) + 0.1f; if(_spectrLine[i] < 0) { _spectrLine[i] = 0; } } memmove(_data + _size, _data, _size*(_size - 1)*sizeof(float)); memcpy(_data, _spectrLine, _size*sizeof(float)); fftwf_destroy_plan(plan); }