Pioneer
GasGiantJobs.h
Go to the documentation of this file.
1 // Copyright © 2008-2015 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _GASGIANTJOBS_H
5 #define _GASGIANTJOBS_H
6 
7 #include <SDL_stdinc.h>
8 
9 #include "JobQueue.h"
10 #include "graphics/Material.h"
12 #include "graphics/VertexBuffer.h"
13 #include "terrain/Terrain.h"
14 #include "vector3.h"
15 
16 #include <deque>
17 
18 namespace Graphics {
19  class Renderer;
20  class RenderState;
21 }
22 
23 namespace GasGiantJobs {
24  //#define DUMP_PARAMS 1
25 
26  // generate root face patches of the cube/sphere
27  static const vector3d p1 = (vector3d(1, 1, 1)).Normalized();
28  static const vector3d p2 = (vector3d(-1, 1, 1)).Normalized();
29  static const vector3d p3 = (vector3d(-1, -1, 1)).Normalized();
30  static const vector3d p4 = (vector3d(1, -1, 1)).Normalized();
31  static const vector3d p5 = (vector3d(1, 1, -1)).Normalized();
32  static const vector3d p6 = (vector3d(-1, 1, -1)).Normalized();
33  static const vector3d p7 = (vector3d(-1, -1, -1)).Normalized();
34  static const vector3d p8 = (vector3d(1, -1, -1)).Normalized();
35 
36  const vector3d &GetPatchFaces(const Uint32 patch, const Uint32 face);
37 
39  public:
40  STextureFaceRequest(const vector3d *v_, const SystemPath &sysPath_, const Sint32 face_, const Sint32 uvDIMs_, Terrain *pTerrain_);
41 
42  // RUNS IN ANOTHER THREAD!! MUST BE THREAD SAFE!
43  // Use only data local to this object
44  void OnRun();
45 
46  Sint32 Face() const { return face; }
47  inline Sint32 UVDims() const { return uvDIMs; }
48  Color *Colors() const { return colors; }
49  const SystemPath &SysPath() const { return sysPath; }
50 
51  protected:
52  // deliberately prevent copy constructor access
54 
55  inline Sint32 NumTexels() const { return uvDIMs * uvDIMs; }
56 
57  // in patch surface coords, [0,1]
58  inline vector3d GetSpherePoint(const double x, const double y) const
59  {
60  return (corners[0] + x * (1.0 - y) * (corners[1] - corners[0]) + x * y * (corners[2] - corners[0]) + (1.0 - x) * y * (corners[3] - corners[0])).Normalized();
61  }
62 
63  // these are created with the request and are given to the resulting patches
65 
66  const vector3d *corners;
68  const Sint32 face;
69  const Sint32 uvDIMs;
71  };
72 
74  public:
77  STextureFaceData(Color *c_, Sint32 uvDims_) :
78  colors(c_),
79  uvDims(uvDims_) {}
81  Sint32 uvDims;
82  };
83 
84  STextureFaceResult(const int32_t face_) :
85  mFace(face_) {}
86 
87  void addResult(Color *c_, Sint32 uvDims_)
88  {
89  PROFILE_SCOPED()
90  mData = STextureFaceData(c_, uvDims_);
91  }
92 
93  inline const STextureFaceData &data() const { return mData; }
94  inline int32_t face() const { return mFace; }
95 
96  void OnCancel()
97  {
98  if (mData.colors) {
99  delete[] mData.colors;
100  mData.colors = NULL;
101  }
102  }
103 
104  protected:
105  // deliberately prevent copy constructor access
107 
108  const int32_t mFace;
110  };
111 
112  // ********************************************************************************
113  // Overloaded PureJob class to handle generating the mesh for each patch
114  // ********************************************************************************
115  class SingleTextureFaceJob : public Job {
116  public:
118  mData(data),
119  mpResults(nullptr)
120  { /* empty */
121  }
122  virtual ~SingleTextureFaceJob();
123 
124  virtual void OnRun();
125  virtual void OnFinish();
126  virtual void OnCancel() {}
127 
128  private:
129  // deliberately prevent copy constructor access
130  SingleTextureFaceJob(const SingleTextureFaceJob &r) = delete;
131 
132  std::unique_ptr<STextureFaceRequest> mData;
133  STextureFaceResult *mpResults;
134  };
135 
136  // ********************************************************************************
137  // a quad with reversed winding
138  class GenFaceQuad {
139  public:
140  GenFaceQuad(Graphics::Renderer *r, const vector2f &size, Graphics::RenderState *state, const Uint32 GGQuality);
141  virtual void Draw(Graphics::Renderer *r);
142 
144  {
145  assert(mat);
146  m_material.reset(mat);
147  }
148  Graphics::Material *GetMaterial() const { return m_material.get(); }
149 
150  private:
151  std::unique_ptr<Graphics::Material> m_material;
152  std::unique_ptr<Graphics::VertexBuffer> m_vertexBuffer;
153  Graphics::RenderState *m_renderState;
154  };
155 
156  // ********************************************************************************
158  public:
159  SGPUGenRequest(const SystemPath &sysPath_, const Sint32 uvDIMs_, Terrain *pTerrain_, const float planetRadius_, const float hueAdjust_, GenFaceQuad *pQuad_, Graphics::Texture *pTex_);
160 
161  inline Sint32 UVDims() const { return uvDIMs; }
162  Graphics::Texture *Texture() const { return m_texture.Get(); }
163  GenFaceQuad *Quad() const { return pQuad; }
164  const SystemPath &SysPath() const { return sysPath; }
165  void SetupMaterialParams(const int face);
166 
167  protected:
168  // deliberately prevent copy constructor access
169  SGPUGenRequest(const SGPUGenRequest &r) = delete;
170 
171  inline Sint32 NumTexels() const { return uvDIMs * uvDIMs; }
172 
173  // this is created with the request and are given to the resulting patches
175 
177  const Sint32 uvDIMs;
179  const float planetRadius;
180  const float hueAdjust;
183  };
184 
185  // ********************************************************************************
187  public:
188  struct SGPUGenData {
190  SGPUGenData(Graphics::Texture *t_, Sint32 uvDims_) :
191  texture(t_),
192  uvDims(uvDims_) {}
194  Sint32 uvDims;
195  };
196 
198 
199  void addResult(Graphics::Texture *t_, Sint32 uvDims_);
200 
201  inline const SGPUGenData &data() const { return mData; }
202 
203  void OnCancel();
204 
205  protected:
206  // deliberately prevent copy constructor access
207  SGPUGenResult(const SGPUGenResult &r) = delete;
208 
210  };
211 
212  // ********************************************************************************
213  // Overloaded JobGPU class to handle generating the mesh for each patch
214  // ********************************************************************************
215  class SingleGPUGenJob : public Job {
216  public:
218  virtual ~SingleGPUGenJob();
219 
220  virtual void OnRun();
221  virtual void OnFinish();
222  virtual void OnCancel() {}
223 
224  private:
225  SingleGPUGenJob() {}
226  // deliberately prevent copy constructor access
227  SingleGPUGenJob(const SingleGPUGenJob &r) = delete;
228 
229  std::unique_ptr<SGPUGenRequest> mData;
230  SGPUGenResult *mpResults;
231  };
232 } // namespace GasGiantJobs
233 
234 #endif /* _GASGIANTJOBS_H */
Definition: GasGiantJobs.h:138
void SetMaterial(Graphics::Material *mat)
Definition: GasGiantJobs.h:143
GenFaceQuad(Graphics::Renderer *r, const vector2f &size, Graphics::RenderState *state, const Uint32 GGQuality)
Definition: GasGiantJobs.cpp:109
virtual void Draw(Graphics::Renderer *r)
Definition: GasGiantJobs.cpp:169
Graphics::Material * GetMaterial() const
Definition: GasGiantJobs.h:148
Definition: GasGiantJobs.h:157
RefCountedPtr< Graphics::Texture > m_texture
Definition: GasGiantJobs.h:174
Terrain * pTerrain
Definition: GasGiantJobs.h:178
SGPUGenRequest(const SystemPath &sysPath_, const Sint32 uvDIMs_, Terrain *pTerrain_, const float planetRadius_, const float hueAdjust_, GenFaceQuad *pQuad_, Graphics::Texture *pTex_)
Definition: GasGiantJobs.cpp:176
Sint32 UVDims() const
Definition: GasGiantJobs.h:161
GenFaceQuad * Quad() const
Definition: GasGiantJobs.h:163
void SetupMaterialParams(const int face)
Definition: GasGiantJobs.cpp:189
const Sint32 uvDIMs
Definition: GasGiantJobs.h:177
const float hueAdjust
Definition: GasGiantJobs.h:180
GenFaceQuad * pQuad
Definition: GasGiantJobs.h:181
Sint32 NumTexels() const
Definition: GasGiantJobs.h:171
const SystemPath & SysPath() const
Definition: GasGiantJobs.h:164
const SystemPath sysPath
Definition: GasGiantJobs.h:176
SGPUGenRequest(const SGPUGenRequest &r)=delete
const float planetRadius
Definition: GasGiantJobs.h:179
Graphics::GenGasGiantColourMaterialParameters m_specialParams
Definition: GasGiantJobs.h:182
Graphics::Texture * Texture() const
Definition: GasGiantJobs.h:162
Definition: GasGiantJobs.h:186
SGPUGenData mData
Definition: GasGiantJobs.h:209
void addResult(Graphics::Texture *t_, Sint32 uvDims_)
Definition: GasGiantJobs.cpp:207
void OnCancel()
Definition: GasGiantJobs.cpp:213
SGPUGenResult()
Definition: GasGiantJobs.h:197
SGPUGenResult(const SGPUGenResult &r)=delete
const SGPUGenData & data() const
Definition: GasGiantJobs.h:201
Definition: GasGiantJobs.h:38
void OnRun()
Definition: GasGiantJobs.cpp:48
RefCountedPtr< Terrain > pTerrain
Definition: GasGiantJobs.h:70
Color * Colors() const
Definition: GasGiantJobs.h:48
Color * colors
Definition: GasGiantJobs.h:64
const vector3d * corners
Definition: GasGiantJobs.h:66
const Sint32 uvDIMs
Definition: GasGiantJobs.h:69
const Sint32 face
Definition: GasGiantJobs.h:68
Sint32 NumTexels() const
Definition: GasGiantJobs.h:55
Sint32 UVDims() const
Definition: GasGiantJobs.h:47
vector3d GetSpherePoint(const double x, const double y) const
Definition: GasGiantJobs.h:58
const SystemPath sysPath
Definition: GasGiantJobs.h:67
STextureFaceRequest(const vector3d *v_, const SystemPath &sysPath_, const Sint32 face_, const Sint32 uvDIMs_, Terrain *pTerrain_)
Definition: GasGiantJobs.cpp:36
const SystemPath & SysPath() const
Definition: GasGiantJobs.h:49
STextureFaceRequest(const STextureFaceRequest &r)=delete
Sint32 Face() const
Definition: GasGiantJobs.h:46
Definition: GasGiantJobs.h:73
void OnCancel()
Definition: GasGiantJobs.h:96
const STextureFaceData & data() const
Definition: GasGiantJobs.h:93
void addResult(Color *c_, Sint32 uvDims_)
Definition: GasGiantJobs.h:87
STextureFaceResult(const int32_t face_)
Definition: GasGiantJobs.h:84
STextureFaceData mData
Definition: GasGiantJobs.h:109
STextureFaceResult(const STextureFaceResult &r)=delete
int32_t face() const
Definition: GasGiantJobs.h:94
const int32_t mFace
Definition: GasGiantJobs.h:108
Definition: GasGiantJobs.h:215
virtual void OnCancel()
Definition: GasGiantJobs.h:222
virtual ~SingleGPUGenJob()
Definition: GasGiantJobs.cpp:228
virtual void OnFinish()
Definition: GasGiantJobs.cpp:274
virtual void OnRun()
Definition: GasGiantJobs.cpp:238
Definition: GasGiantJobs.h:115
virtual void OnRun()
Definition: GasGiantJobs.cpp:88
virtual ~SingleTextureFaceJob()
Definition: GasGiantJobs.cpp:78
virtual void OnCancel()
Definition: GasGiantJobs.h:126
SingleTextureFaceJob(STextureFaceRequest *data)
Definition: GasGiantJobs.h:117
virtual void OnFinish()
Definition: GasGiantJobs.cpp:101
Definition: Material.h:81
Definition: RenderState.h:25
Definition: Renderer.h:39
Definition: Texture.h:106
Definition: JobQueue.h:31
T * Get() const
Definition: SmartPtr.h:37
Definition: SystemPath.h:13
Definition: Terrain.h:25
vector3 Normalized() const
Definition: vector3.h:121
Definition: GasGiantJobs.cpp:23
const vector3d & GetPatchFaces(const Uint32 patch, const Uint32 face)
Definition: GasGiantJobs.cpp:34
Definition: Background.h:13
Definition: Color.h:66
Definition: GasGiantJobs.h:188
RefCountedPtr< Graphics::Texture > texture
Definition: GasGiantJobs.h:193
Sint32 uvDims
Definition: GasGiantJobs.h:194
SGPUGenData(Graphics::Texture *t_, Sint32 uvDims_)
Definition: GasGiantJobs.h:190
SGPUGenData()
Definition: GasGiantJobs.h:189
STextureFaceData()
Definition: GasGiantJobs.h:76
Color * colors
Definition: GasGiantJobs.h:80
Sint32 uvDims
Definition: GasGiantJobs.h:81
STextureFaceData(Color *c_, Sint32 uvDims_)
Definition: GasGiantJobs.h:77
Definition: GenGasGiantColourMaterial.h:17
vector3< double > vector3d
Definition: vector3.h:286