pioneer/src/GasGiantJobs.h

235 lines
6.8 KiB
C++

// Copyright © 2008-2015 Pioneer Developers. See AUTHORS.txt for details
// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
#ifndef _GASGIANTJOBS_H
#define _GASGIANTJOBS_H
#include <SDL_stdinc.h>
#include "JobQueue.h"
#include "graphics/Material.h"
#include "graphics/opengl/GenGasGiantColourMaterial.h"
#include "graphics/VertexBuffer.h"
#include "terrain/Terrain.h"
#include "vector3.h"
#include <deque>
namespace Graphics {
class Renderer;
class RenderState;
}
namespace GasGiantJobs {
//#define DUMP_PARAMS 1
// generate root face patches of the cube/sphere
static const vector3d p1 = (vector3d(1, 1, 1)).Normalized();
static const vector3d p2 = (vector3d(-1, 1, 1)).Normalized();
static const vector3d p3 = (vector3d(-1, -1, 1)).Normalized();
static const vector3d p4 = (vector3d(1, -1, 1)).Normalized();
static const vector3d p5 = (vector3d(1, 1, -1)).Normalized();
static const vector3d p6 = (vector3d(-1, 1, -1)).Normalized();
static const vector3d p7 = (vector3d(-1, -1, -1)).Normalized();
static const vector3d p8 = (vector3d(1, -1, -1)).Normalized();
const vector3d &GetPatchFaces(const Uint32 patch, const Uint32 face);
class STextureFaceRequest {
public:
STextureFaceRequest(const vector3d *v_, const SystemPath &sysPath_, const Sint32 face_, const Sint32 uvDIMs_, Terrain *pTerrain_);
// RUNS IN ANOTHER THREAD!! MUST BE THREAD SAFE!
// Use only data local to this object
void OnRun();
Sint32 Face() const { return face; }
inline Sint32 UVDims() const { return uvDIMs; }
Color *Colors() const { return colors; }
const SystemPath &SysPath() const { return sysPath; }
protected:
// deliberately prevent copy constructor access
STextureFaceRequest(const STextureFaceRequest &r) = delete;
inline Sint32 NumTexels() const { return uvDIMs * uvDIMs; }
// in patch surface coords, [0,1]
inline vector3d GetSpherePoint(const double x, const double y) const
{
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();
}
// these are created with the request and are given to the resulting patches
Color *colors;
const vector3d *corners;
const SystemPath sysPath;
const Sint32 face;
const Sint32 uvDIMs;
RefCountedPtr<Terrain> pTerrain;
};
class STextureFaceResult {
public:
struct STextureFaceData {
STextureFaceData() {}
STextureFaceData(Color *c_, Sint32 uvDims_) :
colors(c_),
uvDims(uvDims_) {}
Color *colors;
Sint32 uvDims;
};
STextureFaceResult(const int32_t face_) :
mFace(face_) {}
void addResult(Color *c_, Sint32 uvDims_)
{
PROFILE_SCOPED()
mData = STextureFaceData(c_, uvDims_);
}
inline const STextureFaceData &data() const { return mData; }
inline int32_t face() const { return mFace; }
void OnCancel()
{
if (mData.colors) {
delete[] mData.colors;
mData.colors = NULL;
}
}
protected:
// deliberately prevent copy constructor access
STextureFaceResult(const STextureFaceResult &r) = delete;
const int32_t mFace;
STextureFaceData mData;
};
// ********************************************************************************
// Overloaded PureJob class to handle generating the mesh for each patch
// ********************************************************************************
class SingleTextureFaceJob : public Job {
public:
SingleTextureFaceJob(STextureFaceRequest *data) :
mData(data),
mpResults(nullptr)
{ /* empty */
}
virtual ~SingleTextureFaceJob();
virtual void OnRun();
virtual void OnFinish();
virtual void OnCancel() {}
private:
// deliberately prevent copy constructor access
SingleTextureFaceJob(const SingleTextureFaceJob &r) = delete;
std::unique_ptr<STextureFaceRequest> mData;
STextureFaceResult *mpResults;
};
// ********************************************************************************
// a quad with reversed winding
class GenFaceQuad {
public:
GenFaceQuad(Graphics::Renderer *r, const vector2f &size, Graphics::RenderState *state, const Uint32 GGQuality);
virtual void Draw(Graphics::Renderer *r);
void SetMaterial(Graphics::Material *mat)
{
assert(mat);
m_material.reset(mat);
}
Graphics::Material *GetMaterial() const { return m_material.get(); }
private:
std::unique_ptr<Graphics::Material> m_material;
std::unique_ptr<Graphics::VertexBuffer> m_vertexBuffer;
Graphics::RenderState *m_renderState;
};
// ********************************************************************************
class SGPUGenRequest {
public:
SGPUGenRequest(const SystemPath &sysPath_, const Sint32 uvDIMs_, Terrain *pTerrain_, const float planetRadius_, const float hueAdjust_, GenFaceQuad *pQuad_, Graphics::Texture *pTex_);
inline Sint32 UVDims() const { return uvDIMs; }
Graphics::Texture *Texture() const { return m_texture.Get(); }
GenFaceQuad *Quad() const { return pQuad; }
const SystemPath &SysPath() const { return sysPath; }
void SetupMaterialParams(const int face);
protected:
// deliberately prevent copy constructor access
SGPUGenRequest(const SGPUGenRequest &r) = delete;
inline Sint32 NumTexels() const { return uvDIMs * uvDIMs; }
// this is created with the request and are given to the resulting patches
RefCountedPtr<Graphics::Texture> m_texture;
const SystemPath sysPath;
const Sint32 uvDIMs;
Terrain *pTerrain;
const float planetRadius;
const float hueAdjust;
GenFaceQuad *pQuad;
Graphics::GenGasGiantColourMaterialParameters m_specialParams;
};
// ********************************************************************************
class SGPUGenResult {
public:
struct SGPUGenData {
SGPUGenData() {}
SGPUGenData(Graphics::Texture *t_, Sint32 uvDims_) :
texture(t_),
uvDims(uvDims_) {}
RefCountedPtr<Graphics::Texture> texture;
Sint32 uvDims;
};
SGPUGenResult() {}
void addResult(Graphics::Texture *t_, Sint32 uvDims_);
inline const SGPUGenData &data() const { return mData; }
void OnCancel();
protected:
// deliberately prevent copy constructor access
SGPUGenResult(const SGPUGenResult &r) = delete;
SGPUGenData mData;
};
// ********************************************************************************
// Overloaded JobGPU class to handle generating the mesh for each patch
// ********************************************************************************
class SingleGPUGenJob : public Job {
public:
SingleGPUGenJob(SGPUGenRequest *data);
virtual ~SingleGPUGenJob();
virtual void OnRun();
virtual void OnFinish();
virtual void OnCancel() {}
private:
SingleGPUGenJob() {}
// deliberately prevent copy constructor access
SingleGPUGenJob(const SingleGPUGenJob &r) = delete;
std::unique_ptr<SGPUGenRequest> mData;
SGPUGenResult *mpResults;
};
} // namespace GasGiantJobs
#endif /* _GASGIANTJOBS_H */