1#ifndef __ANEMONEFISH_VERTEXFIELD_SHADER_HPP
2#define __ANEMONEFISH_VERTEXFIELD_SHADER_HPP
4#include <fish/pond/anemonefish/FieldAnemone.hpp>
5#include <ocean/Anemonia/FloatOrigin.hpp>
6#include "FloatingAnemone.hpp"
14#include <ocean/Anemonia/Programmable.hpp>
21class has_getShaderConditionals
41static auto Test(std::nullptr_t)
42 ->
decltype( std::declval<C>().getShaderPrefix(
43 std::declval<Anemone>(),
44 std::declval<const FieldAnemone::AnemoneCreationContext>(),
45 std::declval<
const RefPtr<FieldAnemone::AnemoneExplorer>>()
86template <
class DisplayShader>
87inline string getShaderConditionals(
const DisplayShader&DS,
88 Anemone&RenderAnemone,
89 const FieldAnemone::AnemoneCreationContext&ARC,
92 return DS.getShaderConditionals(RenderAnemone, ARC, AE);
95template <
class DisplayShader>
96inline string getShaderConditionals(
const DisplayShader&DS,
97 Anemone&RenderAnemone,
98 const FieldAnemone::AnemoneCreationContext&ARC,
104template <
class DisplayShader>
105inline string getShaderConditionals(
const DisplayShader&DS,
106 Anemone&RenderAnemone,
107 const FieldAnemone::AnemoneCreationContext&ARC,
108 const RefPtr<FieldAnemone::AnemoneExplorer>&AE)
118 return getShaderConditionals(DS, RenderAnemone, ARC, AE,
124 template <
class T,
int EL = VSlotContainer::Inval
idExpertLevel >
125 using in = VObject::in<T, EL>;
128template <
class PrimaryType>
153template <
class DisplayShader,
int RenderCategory = HEAVY_OBJECT>
160 typedef typename DisplayShader::FieldType Field_Type_t;
166 typedef typename TypedFieldAnemone_t::GridAnemoneState
185 return DisplayShader::getShaderAttributeName();
190 GridAnemone::AnemoneRenderStatus
191 initializeAnemone(
Anemone&RenderAnemone,
195 GridAnemone::AnemoneRenderStatus
196 InitStatus = TypedFieldAnemone_t::initializeAnemone(RenderAnemone,
ARC,
AE);
197 if (
InitStatus != GridAnemone::AnemoneRenderStatus::AllFine)
204 string ShaderPrefix = this->TypedFieldAnemone_t::getShaderPrefix(
ARC, *
AE);
205 ShaderPrefix += getShaderConditionals(*
this, RenderAnemone,
ARC,
AE);
208 ShaderProgram = this->CompileShader(
ARC.myContext,
this->BaseName(),
211 return this->setProgramParameters(P, RenderAnemone, ARC, AE);
219 RenderAnemone.
insert( ShaderProgram );
223 return GridAnemone::AnemoneRenderStatus::InvalidVertexCoordinates;
226 RenderAnemone.
insert( ARC.myContext.createViewTentacle(ShaderProgram) );
230 this->FieldAnemone::setNamedTextures(RenderAnemone, ShaderProgram);
232 if (this->DisplayShader::initializeAnemone(RenderAnemone, ARC.myContext, *AC))
233 return GridAnemone::AnemoneRenderStatus::AllFine;
236 return GridAnemone::AnemoneRenderStatus::CouldNotInitialize;
252 if (!TypedFieldAnemone_t::isValidAnemone(RenderAnemone,
ARC,
AE))
254 AppVerbose(
"Anemonia", 10) <<
"VertexFieldShader has invalid field Anemone.";
258 if (!
ARC.myAnemoneCreator)
260 AppVerbose(
"Anemonia", 10) <<
"VertexFieldShader has NO Anemone Creator.";
264 if (!
ARC.myContext.LayeredMultiViews::isValid(RenderAnemone))
266 AppVerbose(
"Anemonia", 10) <<
"VertexField Shader Anemone has invalid multiview settings, need to re-create Anemone.";
272 if (!this->DisplayShader::isValidAnemone(RenderAnemone,
ARC.myContext, *AC))
274 AppVerbose(
"Anemonia", 10) <<
"VertexFieldShader has display shader indicating Anemone being invalid.";
280 AppVerbose(
"Anemonia", 10) <<
"VertexFieldShader has invalid Anemoen Creator.";
287 AppVerbose(
"Anemonia", 10) <<
"VertexFieldShader has invalid shader programs which invalidate the Anemone.";
301 return updateTranslation(RenderAnemone,
ARC,
AE);
__bool_constant< true > true_type
__bool_constant< false > false_type
auto declval() noexcept -> decltype(__declval< _Tp >(0))
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
const auto & self() const
MemCore::WeakPtr< Tentacle > insert(const MemCore::WeakPtr< Tentacle > &T, int OrderDeviation=0)
A field Anemone operating on a certain type.
Definition FieldAnemone.hpp:177
Apply a Shader object on a vertex field.
Definition VertexFieldShader.hpp:157
string getShaderAttributeName(const TypedSlot< Fiber::Field > &) const override
Get the name of this field as it should be called in the shader program.
Definition VertexFieldShader.hpp:183
bool isValidAnemone(const Anemone &RenderAnemone, const FieldAnemone::AnemoneCreationContext &ARC, const RefPtr< FieldAnemone::AnemoneExplorer > &AE) const override
Check the validity of the current render anemone by calling the TypedFieldAnemone's isValidAnemone() ...
Definition VertexFieldShader.hpp:248
bool updateAnemone(Anemone &RenderAnemone, const GridAnemone::AnemoneCreationContext &ARC, const RefPtr< GridAnemone::AnemoneExplorer > &AE) const override
Updating a valid Render Anemone, which is setting a possibly modified translation vector.
Definition VertexFieldShader.hpp:297
StrongPtr< Object, ObjectBase > RefPtr
note: cannot derive from FloatingSkeletonRenderer as long as independent base class TriangleRenderer ...
RefPtr< AnemoneCreatorBase > myAnemoneCreator
Definition VertexFieldShader.hpp:123
Definition FloatingAnemone.hpp:57
RefPtr< GridAnemone::AnemoneExplorer > getAnemoneExplorer(const WeakPtr< GridAnemone > &theGridAnemone, VRenderContext &Context) const
Definition FloatingAnemone.cpp:364
bool initializeTranslation(Anemone &RenderAnemone, const GridAnemone::AnemoneCreationContext &ARC, const RefPtr< GridAnemone::AnemoneExplorer > &AE) const
Definition FloatingAnemone.cpp:384
The context of creating a RenderAnemone.
Definition AnemoneCreationContext.hpp:58
Definition VertexFieldShader.hpp:130