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