Copperfield Engine 0.1
C++ Game Engine
Loading...
Searching...
No Matches
shader_manager.hpp
1#pragma once
2#include <unordered_map>
3#include <array>
4#include "globals.hpp"
5
6struct ObjectData;
7struct LightData;
8enum class ShaderType {
9 kVertex,
10 kFragment,
11 kGeometry
12};
13
14enum FragmentNames {
15 kFragmentEmpty = 0,
16 kFragmentUnlit,
17 kFragmentSpotLight,
18 kFragmentScreenQuad,
19 kFragmentDirectional,
20 kFragmentPointLight,
21 kFragmentPointDepth
22};
23enum VertexNames {
24 kVertexLightProjection,
25 kVertexUnlit,
26 kVertexSpotLight,
27 kVertexScreenQuad,
28 kVertexDirectional,
29 kVertexPointLight,
30 kVertexPointDepth
31};
32enum GeometryNames {
33 kGeometryPointDepth
34};
35
36//light uniforms
37static constexpr std::string_view kULightColor = "u_light.light_color";
38static constexpr std::string_view kULightPosition = "u_light.light_position";
39static constexpr std::string_view kULightConstant = "u_light.constant_falloff";
40static constexpr std::string_view kULightLinear = "u_light.linear_falloff";
41static constexpr std::string_view kULightQuadratic = "u_light.quadratic_falloff";
42static constexpr std::string_view kULightDirection = "u_light.light_direction";
43static constexpr std::string_view kULightCutoff = "u_light.cut_off";
44static constexpr std::string_view kULightOuterCutoff = "u_light.outer_cut_off";
45static constexpr std::string_view kULightIntensity = "u_light.intensity";
46
47static constexpr std::string_view kUObjectColor = "u_color";
48static constexpr std::string_view kUObjectTransform = "u_m_matrix";
49static constexpr std::string_view kUObjectRoughness = "u_roughness";
50static constexpr std::string_view kUObjectShininess = "u_shininess";
51
52static constexpr std::string_view u_view_matrix = "u_view_matrix";
53static constexpr std::string_view u_projection_matrix = "u_projection_matrix";
54static constexpr std::string_view u_light_space_matrix = "u_light_space_matrix";
55
56static constexpr std::string_view u_ambient_strength = "u_ambient_strength";
57static constexpr std::string_view u_camera_position = "u_camera_position";
58
59
60
61struct LightCmp;
62struct TransformCmp;
63class ShaderManager {
64public:
65 ShaderManager();
66 ~ShaderManager();
67 ShaderManager(const ShaderManager& other) = delete;
68 ShaderManager(const ShaderManager&& other) = delete;
69 ShaderManager& operator=(const ShaderManager& other) = delete;
70 ShaderManager& operator=(const ShaderManager&& other) = delete;
71
72 bool CreateDefaultShaders();
73
74 bool CreateShader(unsigned int shader, ShaderType type,
75 const std::string& source);
76
78 void attachShaders(unsigned int program, unsigned int fragment,
79 unsigned int vertex, unsigned int geometry = -1) const;
80
82 void useProgram(unsigned int program) const;
83
84 void setAllUniform(DataType dt, const float* number,
85 const std::string_view& uniform_name) const;
86
87 void uploadLightData(const LightData& data,
88 unsigned int program) const;
89 void uploadObjectData(const ObjectData& data,
90 unsigned int program) const;
91
92 void setUniformValue(DataType dt, const float* number, unsigned int program,
93 const std::string_view& uniform_name, int quantity = 1) const;
94
95private:
96 std::array<unsigned int, 10> fragments_;
97 std::array<unsigned int, 10> vertex_;
98 std::array<unsigned int, 5> geometry_;
99 std::array<unsigned int, 12> programs_;
100};
contains globally accessible enums
Component used to simulate different types of lights.
Definition: default_components.hpp:69
Component used to give a position, rotation, and scale to an entity.
Definition: default_components.hpp:284