-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ShaderWriter: Added MixedStructInstanceHelperT.
This class allows declaring a structure to use as IO and buffer block.
- Loading branch information
1 parent
d233928
commit c8af31d
Showing
12 changed files
with
910 additions
and
1,807 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
271 changes: 16 additions & 255 deletions
271
include/ShaderWriter/CompositeTypes/IOStructHelper.hpp
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
283 changes: 283 additions & 0 deletions
283
include/ShaderWriter/CompositeTypes/MixedStructHelper.hpp
Large diffs are not rendered by default.
Oops, something went wrong.
129 changes: 129 additions & 0 deletions
129
include/ShaderWriter/CompositeTypes/MixedStructInstanceHelper.hpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
/* | ||
See LICENSE file in root folder | ||
*/ | ||
#ifndef ___SDW_MixedStructInstanceHelper_H___ | ||
#define ___SDW_MixedStructInstanceHelper_H___ | ||
#pragma once | ||
|
||
#include "StructInstance.hpp" | ||
|
||
#if SDW_EnableStructHelper | ||
|
||
namespace sdw | ||
{ | ||
template< ast::var::Flag FlagT | ||
, StringLiteralT StructNameT | ||
, ast::type::MemoryLayout LayoutT | ||
, typename... FieldsT > | ||
class MixedStructInstanceHelperT | ||
: public StructInstance | ||
{ | ||
static_assert( sizeof...( FieldsT ) > 0 | ||
, "A structure must have at least one field" ); | ||
|
||
public: | ||
~MixedStructInstanceHelperT() override = default; | ||
MixedStructInstanceHelperT( MixedStructInstanceHelperT const & ) = default; | ||
MixedStructInstanceHelperT( MixedStructInstanceHelperT && ) = default; | ||
|
||
MixedStructInstanceHelperT( ShaderWriter & writer | ||
, ast::expr::ExprPtr expr | ||
, bool enabled = true ) | ||
: StructInstance{ writer, std::move( expr ), enabled } | ||
{ | ||
} | ||
|
||
MixedStructInstanceHelperT & operator=( MixedStructInstanceHelperT const & rhs ) | ||
{ | ||
StructInstance::operator=( rhs ); | ||
return *this; | ||
} | ||
|
||
MixedStructInstanceHelperT & operator=( MixedStructInstanceHelperT && rhs ) | ||
{ | ||
StructInstance::operator=( std::move( rhs ) ); | ||
return *this; | ||
} | ||
|
||
template< sdw::StringLiteralT FieldNameT > | ||
constexpr static auto getFieldByName() | ||
{ | ||
return doGetFieldByName< FieldNameT, FieldsT... >(); | ||
} | ||
|
||
template< sdw::StringLiteralT FieldNameT > | ||
constexpr static bool hasFieldByName() | ||
{ | ||
return ( ... || ( std::string_view( FieldNameT.value ) == FieldsT::Name ) ); | ||
} | ||
|
||
template< sdw::StringLiteralT FieldNameT > | ||
auto getMember()const | ||
{ | ||
static_assert( hasFieldByName< FieldNameT >() ); | ||
using FieldT = decltype( getFieldByName< FieldNameT >() ); | ||
return FieldT::template get( *this ); | ||
} | ||
|
||
static type::IOStructPtr makeIOType( type::TypesCache & cache | ||
, ast::EntryPoint entryPoint ) | ||
{ | ||
auto result = cache.getIOStruct( std::string( StructNameT.value ) | ||
, entryPoint | ||
, FlagT ); | ||
|
||
if ( result->empty() ) | ||
{ | ||
( result->declMember( std::string( FieldsT::Name ) | ||
, FieldsT::TypeT::makeType( cache ) | ||
, FieldsT::ArraySize | ||
, FieldsT::Location ) | ||
, ... ); | ||
} | ||
|
||
return result; | ||
} | ||
|
||
static type::BaseStructPtr makeType( type::TypesCache & cache ) | ||
{ | ||
auto result = cache.getStruct( LayoutT | ||
, std::string( StructNameT.value ) ); | ||
|
||
if ( result->empty() ) | ||
{ | ||
( result->declMember( std::string( FieldsT::Name ) | ||
, FieldsT::TypeT::makeType( cache ) | ||
, FieldsT::ArraySize ) | ||
, ... ); | ||
} | ||
|
||
return result; | ||
} | ||
|
||
using StructInstance::getMember; | ||
using StructInstance::getMemberArray; | ||
|
||
private: | ||
template< sdw::StringLiteralT FieldNameT > | ||
constexpr static auto doGetFieldByName() | ||
{ | ||
return sdw::Void{}; | ||
} | ||
|
||
template< sdw::StringLiteralT FieldNameT, typename FieldU, typename... FieldsU > | ||
constexpr static auto doGetFieldByName() | ||
{ | ||
if constexpr ( std::string_view( FieldNameT.value ) == FieldU::Name ) | ||
{ | ||
return FieldU{}; | ||
} | ||
else | ||
{ | ||
return doGetFieldByName< FieldNameT, FieldsU... >(); | ||
} | ||
} | ||
}; | ||
} | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.