mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 20:06:02 +02:00
After trying stop trying to expose a generic [] operator on Varying and Containers
This commit is contained in:
parent
42eaaf742d
commit
e31a3b4d08
10 changed files with 46 additions and 67 deletions
|
@ -342,8 +342,8 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren
|
||||||
assert(renderContext->args->hasViewFrustum());
|
assert(renderContext->args->hasViewFrustum());
|
||||||
RenderArgs* args = renderContext->args;
|
RenderArgs* args = renderContext->args;
|
||||||
|
|
||||||
auto& diffusedCurvatureFramebuffer = inputs.getFirst();
|
auto& diffusedCurvatureFramebuffer = inputs.get0();
|
||||||
auto& scatteringFramebuffer = inputs.getSecond();
|
auto& scatteringFramebuffer = inputs.get1();
|
||||||
|
|
||||||
gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
|
gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
|
||||||
batch.enableStereo(false);
|
batch.enableStereo(false);
|
||||||
|
|
|
@ -34,7 +34,7 @@ signals:
|
||||||
|
|
||||||
class DebugDeferredBuffer {
|
class DebugDeferredBuffer {
|
||||||
public:
|
public:
|
||||||
using Inputs = render::VaryingPair<gpu::FramebufferPointer, gpu::FramebufferPointer>;
|
using Inputs = render::VaryingSet2<gpu::FramebufferPointer, gpu::FramebufferPointer>;
|
||||||
using Config = DebugDeferredBufferConfig;
|
using Config = DebugDeferredBufferConfig;
|
||||||
using JobModel = render::Job::ModelI<DebugDeferredBuffer, Inputs, Config>;
|
using JobModel = render::Job::ModelI<DebugDeferredBuffer, Inputs, Config>;
|
||||||
|
|
||||||
|
|
|
@ -171,9 +171,9 @@ void SubsurfaceScattering::run(const render::SceneContextPointer& sceneContext,
|
||||||
|
|
||||||
auto pipeline = getScatteringPipeline();
|
auto pipeline = getScatteringPipeline();
|
||||||
|
|
||||||
auto& frameTransform = inputs.getFirst();
|
auto& frameTransform = inputs.get0();
|
||||||
auto& curvatureFramebuffer = inputs.getSecond();
|
auto& curvatureFramebuffer = inputs.get1();
|
||||||
auto& diffusedFramebuffer = inputs.getThird();
|
auto& diffusedFramebuffer = inputs.get2();
|
||||||
|
|
||||||
|
|
||||||
auto framebufferCache = DependencyManager::get<FramebufferCache>();
|
auto framebufferCache = DependencyManager::get<FramebufferCache>();
|
||||||
|
|
|
@ -48,7 +48,7 @@ signals:
|
||||||
|
|
||||||
class SubsurfaceScattering {
|
class SubsurfaceScattering {
|
||||||
public:
|
public:
|
||||||
using Inputs = render::VaryingTrio<DeferredFrameTransformPointer, gpu::FramebufferPointer, gpu::FramebufferPointer>;
|
using Inputs = render::VaryingSet3<DeferredFrameTransformPointer, gpu::FramebufferPointer, gpu::FramebufferPointer>;
|
||||||
using Config = SubsurfaceScatteringConfig;
|
using Config = SubsurfaceScatteringConfig;
|
||||||
using JobModel = render::Job::ModelIO<SubsurfaceScattering, Inputs, gpu::FramebufferPointer, Config>;
|
using JobModel = render::Job::ModelIO<SubsurfaceScattering, Inputs, gpu::FramebufferPointer, Config>;
|
||||||
|
|
||||||
|
|
|
@ -60,8 +60,8 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c
|
||||||
auto pyramidTexture = framebufferCache->getDepthPyramidTexture();
|
auto pyramidTexture = framebufferCache->getDepthPyramidTexture();
|
||||||
auto curvatureFBO = framebufferCache->getCurvatureFramebuffer();
|
auto curvatureFBO = framebufferCache->getCurvatureFramebuffer();
|
||||||
|
|
||||||
curvatureAndDepth.first. template edit<gpu::FramebufferPointer>() = curvatureFBO;
|
curvatureAndDepth.edit0() = curvatureFBO;
|
||||||
curvatureAndDepth.second. template edit<gpu::TexturePointer>() = pyramidTexture;
|
curvatureAndDepth.edit1() = pyramidTexture;
|
||||||
|
|
||||||
auto curvatureTexture = framebufferCache->getCurvatureTexture();
|
auto curvatureTexture = framebufferCache->getCurvatureTexture();
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ signals:
|
||||||
|
|
||||||
class SurfaceGeometryPass {
|
class SurfaceGeometryPass {
|
||||||
public:
|
public:
|
||||||
using Outputs = render::VaryingPair<gpu::FramebufferPointer, gpu::TexturePointer>;
|
using Outputs = render::VaryingSet2<gpu::FramebufferPointer, gpu::TexturePointer>;
|
||||||
using Config = SurfaceGeometryPassConfig;
|
using Config = SurfaceGeometryPassConfig;
|
||||||
using JobModel = render::Job::ModelIO<SurfaceGeometryPass, DeferredFrameTransformPointer, Outputs, Config>;
|
using JobModel = render::Job::ModelIO<SurfaceGeometryPass, DeferredFrameTransformPointer, Outputs, Config>;
|
||||||
|
|
||||||
|
|
|
@ -306,8 +306,8 @@ void BlurGaussianDepthAware::run(const SceneContextPointer& sceneContext, const
|
||||||
|
|
||||||
RenderArgs* args = renderContext->args;
|
RenderArgs* args = renderContext->args;
|
||||||
|
|
||||||
auto& sourceFramebuffer = SourceAndDepth.getFirst();
|
auto& sourceFramebuffer = SourceAndDepth.get0();
|
||||||
auto& depthTexture = SourceAndDepth.getSecond();
|
auto& depthTexture = SourceAndDepth.get1();
|
||||||
|
|
||||||
BlurInOutResource::Resources blurringResources;
|
BlurInOutResource::Resources blurringResources;
|
||||||
if (!_inOutResources.updateResources(sourceFramebuffer, blurringResources)) {
|
if (!_inOutResources.updateResources(sourceFramebuffer, blurringResources)) {
|
||||||
|
|
|
@ -121,7 +121,7 @@ protected:
|
||||||
|
|
||||||
class BlurGaussianDepthAware {
|
class BlurGaussianDepthAware {
|
||||||
public:
|
public:
|
||||||
using Inputs = VaryingPair<gpu::FramebufferPointer, gpu::TexturePointer>;
|
using Inputs = VaryingSet2<gpu::FramebufferPointer, gpu::TexturePointer>;
|
||||||
using Config = BlurGaussianDepthAwareConfig;
|
using Config = BlurGaussianDepthAwareConfig;
|
||||||
using JobModel = Job::ModelIO<BlurGaussianDepthAware, Inputs, gpu::FramebufferPointer, Config>;
|
using JobModel = Job::ModelIO<BlurGaussianDepthAware, Inputs, gpu::FramebufferPointer, Config>;
|
||||||
|
|
||||||
|
|
|
@ -27,14 +27,14 @@ void TaskConfig::refresh() {
|
||||||
|
|
||||||
namespace render{
|
namespace render{
|
||||||
|
|
||||||
template <> void varyingGet(const VaryingPairBase* data, uint8_t index, Varying& var) {
|
template <> void varyingGet(const VaryingPairBase& data, uint8_t index, Varying& var) {
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
var = data->first;
|
var = data.first;
|
||||||
} else {
|
} else {
|
||||||
var = data->second;
|
var = data.second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> uint8_t varyingLength(const VaryingPairBase* data) { return 2; }
|
template <> uint8_t varyingLength(const VaryingPairBase& data) { return 2; }
|
||||||
|
|
||||||
}
|
}
|
|
@ -30,9 +30,11 @@
|
||||||
namespace render {
|
namespace render {
|
||||||
|
|
||||||
class Varying;
|
class Varying;
|
||||||
|
|
||||||
template <class T> void varyingGet(const T* data, uint8_t index, Varying& var) {}
|
|
||||||
template <class T> uint8_t varyingLength(const T* data) { return 0; }
|
|
||||||
|
template < class T > void varyingGet(const T& data, uint8_t index, Varying& var) {}
|
||||||
|
template <class T> uint8_t varyingLength(const T& data) { return 0; }
|
||||||
|
|
||||||
// A varying piece of data, to be used as Job/Task I/O
|
// A varying piece of data, to be used as Job/Task I/O
|
||||||
// TODO: Task IO
|
// TODO: Task IO
|
||||||
|
@ -52,7 +54,7 @@ public:
|
||||||
|
|
||||||
// access potential sub varyings contained in this one.
|
// access potential sub varyings contained in this one.
|
||||||
Varying operator[] (uint8_t index) const { return (*_concept)[index]; }
|
Varying operator[] (uint8_t index) const { return (*_concept)[index]; }
|
||||||
uint8_t length() const { return _concept->length(); }
|
uint8_t length() const { return (*_concept).length(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
class Concept {
|
class Concept {
|
||||||
|
@ -65,19 +67,16 @@ protected:
|
||||||
template <class T> class Model : public Concept {
|
template <class T> class Model : public Concept {
|
||||||
public:
|
public:
|
||||||
using Data = T;
|
using Data = T;
|
||||||
// using VarContainer = std::enable_if<T::VarContainer>;
|
|
||||||
//using VarContainer = std::conditional<std::enable_if<T::VarContainer>, T::VarContainer, T>;
|
|
||||||
|
|
||||||
Model(const Data& data) : _data(data) {}
|
Model(const Data& data) : _data(data) {}
|
||||||
virtual ~Model() = default;
|
virtual ~Model() = default;
|
||||||
|
|
||||||
|
|
||||||
virtual Varying operator[] (uint8_t index) const {
|
virtual Varying operator[] (uint8_t index) const {
|
||||||
Varying var;
|
Varying var;
|
||||||
// varyingGet<VarContainer>(&_data, index, var);
|
varyingGet< T >(_data, index, var);
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
virtual uint8_t length() const { return varyingLength<T>(&_data); }
|
virtual uint8_t length() const { return varyingLength<T>(_data); }
|
||||||
|
|
||||||
Data _data;
|
Data _data;
|
||||||
};
|
};
|
||||||
|
@ -85,67 +84,47 @@ protected:
|
||||||
std::shared_ptr<Concept> _concept;
|
std::shared_ptr<Concept> _concept;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
using VaryingPairBase = std::pair<Varying, Varying>;
|
using VaryingPairBase = std::pair<Varying, Varying>;
|
||||||
|
|
||||||
|
template <> void varyingGet(const VaryingPairBase& data, uint8_t index, Varying& var);
|
||||||
template <> void varyingGet(const VaryingPairBase* data, uint8_t index, Varying& var);
|
template <> uint8_t varyingLength(const VaryingPairBase& data);
|
||||||
template <> uint8_t varyingLength(const VaryingPairBase* data);
|
|
||||||
|
|
||||||
template < typename T0, typename T1 >
|
template < typename T0, typename T1 >
|
||||||
class VaryingPair : public VaryingPairBase {
|
class VaryingSet2 : public VaryingPairBase {
|
||||||
public:
|
public:
|
||||||
using Parent = VaryingPairBase;
|
using Parent = VaryingPairBase;
|
||||||
using VarContainer = VaryingPairBase;
|
typedef void is_proxy_tag;
|
||||||
|
|
||||||
VaryingPair() : Parent(Varying(T0()), Varying(T1())) {}
|
VaryingSet2() : Parent(Varying(T0()), Varying(T1())) {}
|
||||||
VaryingPair(const VaryingPair& pair) : Parent(pair.first, pair.second) {}
|
VaryingSet2(const VaryingSet2& pair) : Parent(pair.first, pair.second) {}
|
||||||
VaryingPair(const Varying& first, const Varying& second) : Parent(first, second) {}
|
VaryingSet2(const Varying& first, const Varying& second) : Parent(first, second) {}
|
||||||
|
|
||||||
const T0& getFirst() const { return first.get<T0>(); }
|
const T0& get0() const { return first.get<T0>(); }
|
||||||
T0& editFirst() { return first.edit<T0>(); }
|
T0& edit0() { return first.edit<T0>(); }
|
||||||
|
|
||||||
const T1& getSecond() const { return second.get<T1>(); }
|
const T1& get1() const { return second.get<T1>(); }
|
||||||
T1& editSecond() { return second.edit<T1>(); }
|
T1& edit1() { return second.edit<T1>(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template <class T0, class T1, class T2>
|
template <class T0, class T1, class T2>
|
||||||
class VaryingTrio : public std::tuple<Varying, Varying,Varying>{
|
class VaryingSet3 : public std::tuple<Varying, Varying,Varying>{
|
||||||
public:
|
public:
|
||||||
using Parent = std::tuple<Varying, Varying, Varying>;
|
using Parent = std::tuple<Varying, Varying, Varying>;
|
||||||
|
|
||||||
VaryingTrio() : Parent(Varying(T0()), Varying(T1()), Varying(T2())) {}
|
VaryingSet3() : Parent(Varying(T0()), Varying(T1()), Varying(T2())) {}
|
||||||
VaryingTrio(const VaryingTrio& trio) : Parent(std::get<0>(trio), std::get<1>(trio), std::get<2>(trio)) {}
|
VaryingSet3(const VaryingSet3& trio) : Parent(std::get<0>(trio), std::get<1>(trio), std::get<2>(trio)) {}
|
||||||
VaryingTrio(const Varying& first, const Varying& second, const Varying& third) : Parent(first, second, third) {}
|
VaryingSet3(const Varying& first, const Varying& second, const Varying& third) : Parent(first, second, third) {}
|
||||||
|
|
||||||
const T0& getFirst() const { return std::get<0>((*this)).template get<T0>(); }
|
const T0& get0() const { return std::get<0>((*this)).template get<T0>(); }
|
||||||
T0& editFirst() { return std::get<0>((*this)).template edit<T0>(); }
|
T0& edit0() { return std::get<0>((*this)).template edit<T0>(); }
|
||||||
|
|
||||||
const T1& getSecond() const { return std::get<1>((*this)).template get<T1>(); }
|
const T1& get1() const { return std::get<1>((*this)).template get<T1>(); }
|
||||||
T1& editSecond() { return std::get<1>((*this)).template edit<T1>(); }
|
T1& edit1() { return std::get<1>((*this)).template edit<T1>(); }
|
||||||
|
|
||||||
const T2& getThird() const { return std::get<2>((*this)).template get<T2>(); }
|
const T2& get2() const { return std::get<2>((*this)).template get<T2>(); }
|
||||||
T2& editThird() { return std::get<2>((*this)).template edit<T2>(); }
|
T2& edit2() { return std::get<2>((*this)).template edit<T2>(); }
|
||||||
};
|
};
|
||||||
/*
|
|
||||||
template <class... _Types>
|
|
||||||
class VaryingTuple : public std::tuple<_Types>{
|
|
||||||
public:
|
|
||||||
using Parent = std::tuple<_Types>;
|
|
||||||
|
|
||||||
VaryingPair() : Parent(Varying(T0()), Varying(T1())) {}
|
|
||||||
VaryingPair(const VaryingPair& pair) : Parent(pair.first, pair.second) {}
|
|
||||||
VaryingPair(const Varying& first, const Varying& second) : Parent(first, second) {}
|
|
||||||
|
|
||||||
const T0& getFirst() const { return first.get<T0>(); }
|
|
||||||
T0& editFirst() { return first.edit<T0>(); }
|
|
||||||
|
|
||||||
const T1& getSecond() const { return second.get<T1>(); }
|
|
||||||
T1& editSecond() { return second.edit<T1>(); }
|
|
||||||
};*/
|
|
||||||
|
|
||||||
template < class T, int NUM >
|
template < class T, int NUM >
|
||||||
class VaryingArray : public std::array<Varying, NUM> {
|
class VaryingArray : public std::array<Varying, NUM> {
|
||||||
|
|
Loading…
Reference in a new issue