gltest/src/SpectralMesh.cpp

48 lines
1.2 KiB
C++

//
// Created by selim on 07.07.15.
//
#include "SpectralMesh.h"
#include <string.h>
#include <iostream>
#include <cmath>
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);
}