Cogs.Core
WaveSpectrum.h
1#pragma once
2
3#include "FourierTransform.h"
4#include "GPGPUQuadRenderer.h"
5
6#include "Rendering/Common.h"
7
8#include <vector>
9
10namespace Cogs
11{
12 class IGraphicsDevice;
13
15 {
16 public:
17
18 void initialize(IGraphicsDevice* device);
19
20 void setSize(const int Nlog2);
21
22 float setConditions(const float tileExtent,
23 const float waveNumberMute,
24 const float waveNumberPass,
25 const float significantWavePeriod,
26 const float windSpeed,
27 const float windDirection,
28 const float scale = 0.f,
29 const unsigned int seed = 42);
30
31 bool update(RenderContext& renderContext, const float dt);
32
33 TextureHandle positionTex() { return packed.xyzTex; }
34
35 TextureHandle derivativesTex() { return packed.dxdu_dydv_dzdu_dzdvTex; }
36
37
38 float getTileExtent() const { return tileExtent; }
39
40 float getTileExtentAdjust() const { return tileExtentAdjust; }
41
42 float getAdjustedTileExtent() const { return tileExtentAdjust*tileExtent; }
43
44 protected:
45 GPGPUQuadRenderer gpgpuQuadRenderer;
46 FourierTransform2D fourierTransform;
47 IGraphicsDevice* device;
48 float tileExtent;
49 float tileExtentAdjust;
50 int NLog2;
51 int N;
52
53 int frame;
54
55 TextureHandle phaseTex[2];
56 RenderTargetHandle dispersionTarget[2];
57
58 struct {
59 EffectHandle effect;
61 BufferHandle constantBuffer;
62 } texturePack;
63
64
65 struct {
66 EffectHandle effect;
68 BufferHandle constantBuffer;
69 } disperse;
70
71 struct {
72 std::vector<float> E;
73 std::vector<glm::vec2> a;
74 TextureHandle aTex;
75 TextureHandle xyTex;
76 TextureHandle zTex;
77 TextureHandle dzdu_dzdv_Tex;
78 } frequencyDomain;
79
80 struct {
81 TextureHandle xyzTex;
82 TextureHandle dxdu_dydv_dzdu_dzdvTex;
83 RenderTargetHandle packTarget;
84 } packed;
85
86 struct {
87 TextureHandle xyTex;
88 TextureHandle zTex;
89 TextureHandle dzdu_dzdv_Tex;
90 RenderTargetHandle xyTarget;
91 RenderTargetHandle zTarget;
92 RenderTargetHandle dzduTarget;
93 } spatialDomain;
94
95 static float createDirectionalWaveSpectrum(std::vector<float>& E,
96 int N,
97 float L,
98 float freqPassZero,
99 float freqPassOne,
100 float windSpeed,
101 float windDirection,
102 float dominantWavePeriod,
103 float scale = 0.f);
104
105 static void createRandomizedWaveSpectrumInstance(std::vector<glm::vec2>& H,
106 const std::vector<float>& E,
107 const unsigned int seed,
108 const size_t N);
109 };
110
111}
Represents a graphics device used to manage graphics resources and issue drawing commands.
std::vector< glm::vec2 > a
Frequency representation of sea state at t=0.
Definition: WaveSpectrum.h:73
static float createDirectionalWaveSpectrum(std::vector< float > &E, int N, float L, float freqPassZero, float freqPassOne, float windSpeed, float windDirection, float dominantWavePeriod, float scale=0.f)
Contains all Cogs related functionality.
Definition: FieldSetter.h:23