iWaveOcean
3ds Max ocean simulation plugin
VerticalDerivativeConvolution.h
1 #pragma once
2 #include "IConvolution.h"
3 #include "Convolution.h"
4 
5 template <int radius>
7 {
8  float _kernel[2 * radius + 1][2 * radius + 1];
9  IConvolution<radius>* _convolution;
10 
11  static void GetVerticalDerivKernel(float(& arr)[2 * radius + 1][2 * radius + 1])
12  {
13  float dq = 0.001;
14  float sigma = 1.0;
15 
16  double G_0 = 0.0; // Norm value.
17  for (float q = 0.0; q < 10.0; q += dq)
18  {
19  // From the paper, we want dq = .001 and calculate q_n for 1 <= n <= 10000.
20  // This gives us 0 <= q < 10.
21  G_0 += q * q * exp(-sigma * q * q);
22  }
23 
24  for (int i = -radius; i <= radius; i++)
25  {
26  for (int j = -radius; j <= radius; j++)
27  {
28  float r = sqrt((float)(i * i + j * j));
29  float kern = 0.0;
30 
31  for (float q = 0.0; q < 10.0; q += dq)
32  {
33  kern += q * q * exp(-sigma * q * q) * j0(r * q);
34  }
35 
36  arr[i + radius][j + radius] = kern / G_0;
37  }
38  }
39  }
40 
41 public:
43  {
44  GetVerticalDerivKernel(_kernel);
45  _convolution = new Convolution<radius, ReflectEdges>(_kernel);
46  }
47 
48  void Convolve(float* in, float* out, int rows, int cols) const
49  {
50  _convolution->Convolve(in, out, rows, cols);
51  }
52 
54  {
55  delete _convolution;
56  }
57 };
58 
void Convolve(float *in, float *out, int rows, int cols) const
Definition: VerticalDerivativeConvolution.h:48
Definition: IConvolution.h:5
Definition: Convolution.h:22
virtual void Convolve(float *in, float *out, int rows, int cols) const =0
Definition: VerticalDerivativeConvolution.h:6