17#include <unordered_map>
18#include "aeongames/Pipeline.hpp"
20#include "aeongames/ProtoBufHelpers.hpp"
22#pragma warning( push )
23#pragma warning( disable : PROTOBUF_WARNINGS )
25#include "pipeline.pb.h"
26#include "property.pb.h"
34 static const std::unordered_map<PipelineMsg_Topology, Topology> TopologyMap
36 {PipelineMsg_Topology::PipelineMsg_Topology_POINT_LIST,
POINT_LIST},
37 {PipelineMsg_Topology::PipelineMsg_Topology_LINE_STRIP,
LINE_STRIP},
38 {PipelineMsg_Topology::PipelineMsg_Topology_LINE_LIST,
LINE_LIST},
39 {PipelineMsg_Topology::PipelineMsg_Topology_TRIANGLE_STRIP,
TRIANGLE_STRIP},
40 {PipelineMsg_Topology::PipelineMsg_Topology_TRIANGLE_FAN,
TRIANGLE_FAN},
41 {PipelineMsg_Topology::PipelineMsg_Topology_TRIANGLE_LIST,
TRIANGLE_LIST},
46 {PipelineMsg_Topology::PipelineMsg_Topology_PATCH_LIST,
PATCH_LIST},
49 static const std::unordered_map<UniformDescriptorMsg_Type, UniformType> UniformTypeMap
51 {UniformDescriptorMsg_Type::UniformDescriptorMsg_Type_SCALAR_FLOAT, SCALAR_FLOAT},
52 {UniformDescriptorMsg_Type::UniformDescriptorMsg_Type_SCALAR_UINT, SCALAR_UINT},
53 {UniformDescriptorMsg_Type::UniformDescriptorMsg_Type_SCALAR_INT, SCALAR_INT},
54 {UniformDescriptorMsg_Type::UniformDescriptorMsg_Type_VECTOR_FLOAT_2, VECTOR_FLOAT_2},
55 {UniformDescriptorMsg_Type::UniformDescriptorMsg_Type_VECTOR_FLOAT_3, VECTOR_FLOAT_3},
56 {UniformDescriptorMsg_Type::UniformDescriptorMsg_Type_VECTOR_FLOAT_4, VECTOR_FLOAT_4},
65 return mTopologyClass;
69 const std::string& Pipeline::GetVertexShaderCode()
const
71 return mVertexShaderCode;
73 const std::string& Pipeline::GetFragmentShaderCode()
const
75 return mFragmentShaderCode;
78 const std::vector<std::tuple<UniformType, std::string >> & Pipeline::GetUniformDescriptors()
const
80 return mUniformDescriptors;
83 const std::vector<std::string>& Pipeline::GetSamplerDescriptors()
const
85 return mSamplerDescriptors;
88 std::string Pipeline::GetProperties ()
const
90 std::string properties{};
91 for (
auto& i : mUniformDescriptors )
93 switch ( std::get<0> ( i ) )
96 properties +=
"float " + std::get<1> ( i ) +
";\n";
99 properties +=
"uint " + std::get<1> ( i ) +
";\n";
102 properties +=
"int " + std::get<1> ( i ) +
";\n";
105 properties +=
"vec2 " + std::get<1> ( i ) +
";\n";
108 properties +=
"vec3 " + std::get<1> ( i ) +
";\n";
111 properties +=
"vec4 " + std::get<1> ( i ) +
";\n";
115 throw std::runtime_error (
"Unknown Type." );
121 static const std::array<const char*, 8> AttributeStrings
129 "VertexWeightIndices",
135 static const std::array<const char*, 8> AttributeTypes
149 uint32_t Pipeline::GetAttributeBitmap()
const
151 static const std::regex AttributeRegex
153 "\\bVertexPosition\\b|"
154 "\\bVertexNormal\\b|"
155 "\\bVertexTangent\\b|"
156 "\\bVertexBitangent\\b|"
158 "\\bVertexWeightIndices\\b|"
159 "\\bVertexWeights\\b|"
160 "\\bVertexColor\\b" };
162 std::smatch attribute_matches;
163 uint32_t attributes{};
164 std::string code{mVertexShaderCode};
165 while ( std::regex_search ( code, attribute_matches, AttributeRegex ) )
167 for ( uint32_t i = 0; i < AttributeStrings.size(); ++i )
169 if ( attribute_matches.str().substr ( 6 ) == AttributeStrings[i] + 6 )
171 if ( ! ( attributes & ( 1 << i ) ) )
173 attributes |= ( 1 << i );
178 code = attribute_matches.suffix();
183 std::string Pipeline::GetAttributes()
const
185 std::string attribute_code{};
186 uint32_t attributes{ GetAttributeBitmap() };
187 for ( uint32_t i = 0; i < AttributeStrings.size(); ++i )
189 if ( attributes & ( 1 << i ) )
191 attribute_code.append (
"layout(location = " );
192 attribute_code.append ( std::to_string ( i ) );
193 attribute_code.append (
") in " );
194 attribute_code.append ( AttributeTypes[i] );
195 attribute_code.append (
" " );
196 attribute_code.append ( AttributeStrings[i] );
197 attribute_code.append (
";\n" );
200 return attribute_code;
206 return mShaderCode[aType];
216 mShaderCode[
VERT] = aPipelineMsg.vert();
217 mShaderCode[
FRAG] = aPipelineMsg.frag();
218 mShaderCode[
COMP] = aPipelineMsg.comp();
219 mShaderCode[
TESC] = aPipelineMsg.tesc();
220 mShaderCode[
TESE] = aPipelineMsg.tese();
221 mShaderCode[
GEOM] = aPipelineMsg.geom();
222 if ( aPipelineMsg.has_topology_class() )
224 mTopologyClass =
static_cast<uint32_t
> ( aPipelineMsg.topology_class() );
235 for (
auto& i : mShaderCode )
Provides the DLL_PROTOBUF export/import macro for protobuf wrapper classes.
DLL void Unload() final
Release all pipeline resources.
static const uint32_t TOPOLOGY_CLASS_TRIANGLE
Triangle topology class bitmask.
DLL const std::string_view GetShaderCode(ShaderType aType) const
Get the shader source code for the given shader stage.
virtual DLL ~Pipeline()
Virtual destructor.
DLL void LoadFromMemory(const void *aBuffer, size_t aBufferSize) final
Load pipeline data from a memory buffer.
DLL void LoadFromPBMsg(const PipelineMsg &aPipelineMsg)
Load pipeline configuration from a protobuf message.
DLL uint32_t GetTopologyClass() const
Get the topology class bitmask for this pipeline.
DLL Pipeline()
Default constructor.
<- This is here just for the literals
void LoadFromProtoBufObject(T &aTarget, const void *aBuffer, size_t aBufferSize)
Loads a Protocol Buffer message from a buffer and populates a target object.
ShaderType
Shader stage types.
@ TESC
Tessellation control shader.
@ TESE
Tessellation evaluation shader.
@ TRIANGLE_STRIP
Connected triangle strip.
@ PATCH_LIST
Patch list for tessellation.
@ LINE_LIST_WITH_ADJACENCY
Line list with adjacency information.
@ TRIANGLE_LIST_WITH_ADJACENCY
Triangle list with adjacency information.
@ POINT_LIST
List of individual points.
@ LINE_STRIP
Connected line segments.
@ LINE_LIST
Pairs of vertices forming individual lines.
@ TRIANGLE_LIST
Independent triangles.
@ TRIANGLE_STRIP_WITH_ADJACENCY
Triangle strip with adjacency information.
@ TRIANGLE_FAN
Triangles sharing a common vertex.
@ LINE_STRIP_WITH_ADJACENCY
Line strip with adjacency information.