48 lines
1.2 KiB
C++
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);
|
|
}
|