载入中...
搜索中...
未找到
Shader.cpp
浏览该文件的文档.
1#include "graphics/Shader.h"
2#include "common/Exception.h"
3
4#include <cstring>
5
6namespace eve::graphics {
7
8Shader::Shader() = default;
9
10Shader::~Shader() = default;
11
12int Shader::declareUniform(const std::string &name, int floatCount) {
13 if (name.empty()) throw Exception("Shader::declare: empty uniform name");
14 if (floatCount <= 0) throw Exception("Shader::declare: invalid float count");
15 if (auto *existing = findUniform(name)) {
16 if (existing->floatCount != floatCount)
17 throw Exception("Shader::declare: '%s' already declared with different size", name.c_str());
18 return existing->index;
19 }
20 if (usedFloats_ + floatCount > kMaxFloats)
21 throw Exception("Shader::declare: push-constant block full (max %d floats)", kMaxFloats);
22 Uniform u;
23 u.index = usedFloats_;
24 u.floatCount = floatCount;
25 uniforms_[name] = u;
26 usedFloats_ += floatCount;
27 return u.index;
28}
29
30int Shader::declareFloat(const std::string &name) { return declareUniform(name, 1); }
31int Shader::declareVec2(const std::string &name) { return declareUniform(name, 2); }
32int Shader::declareVec3(const std::string &name) { return declareUniform(name, 3); }
33int Shader::declareVec4(const std::string &name) { return declareUniform(name, 4); }
34int Shader::declareMatrix(const std::string &name) { return declareUniform(name, 16); }
35
36Shader::Uniform *Shader::findUniform(const std::string &name) {
37 auto it = uniforms_.find(name);
38 return it == uniforms_.end() ? nullptr : &it->second;
39}
40
41const Shader::Uniform *Shader::findUniform(const std::string &name) const {
42 auto it = uniforms_.find(name);
43 return it == uniforms_.end() ? nullptr : &it->second;
44}
45
46bool Shader::hasUniform(const std::string &name) const { return findUniform(name) != nullptr; }
47
48int Shader::getUniformIndex(const std::string &name) const {
49 auto *u = findUniform(name);
50 if (!u) throw Exception("Shader: unknown uniform '%s'", name.c_str());
51 return u->index;
52}
53
54int Shader::getUniformFloatCount(const std::string &name) const {
55 auto *u = findUniform(name);
56 if (!u) throw Exception("Shader: unknown uniform '%s'", name.c_str());
57 return u->floatCount;
58}
59
60int Shader::sendToVar(const std::string &name, const void *data, size_t size) {
61 auto *u = findUniform(name);
62 if (!u) throw Exception("Shader::send: unknown uniform '%s' (declare it first)", name.c_str());
63 if (!data) throw Exception("Shader::send: null data for '%s'", name.c_str());
64 const size_t expected = size_t(u->floatCount) * sizeof(float);
65 if (size != expected)
66 throw Exception("Shader::send: '%s' expects %zu bytes, got %zu", name.c_str(), expected, size);
67 std::memcpy(floats_.data() + u->index, data, size);
68 return int(size);
69}
70
71int Shader::getFromVar(const std::string &name, void *data, size_t size) const {
72 auto *u = findUniform(name);
73 if (!u) throw Exception("Shader::get: unknown uniform '%s'", name.c_str());
74 if (!data) throw Exception("Shader::get: null data for '%s'", name.c_str());
75 const size_t expected = size_t(u->floatCount) * sizeof(float);
76 if (size != expected)
77 throw Exception("Shader::get: '%s' expects %zu bytes, got %zu", name.c_str(), expected, size);
78 std::memcpy(data, floats_.data() + u->index, size);
79 return int(size);
80}
81
82void Shader::sendFloat(const std::string &name, float x) { sendToVar(name, &x, sizeof(x)); }
83
84void Shader::sendVec2(const std::string &name, float x, float y) {
85 const float v[2] = {x, y};
86 sendToVar(name, v, sizeof(v));
87}
88
89void Shader::sendVec3(const std::string &name, float x, float y, float z) {
90 const float v[3] = {x, y, z};
91 sendToVar(name, v, sizeof(v));
92}
93
94void Shader::sendVec4(const std::string &name, float x, float y, float z, float w) {
95 const float v[4] = {x, y, z, w};
96 sendToVar(name, v, sizeof(v));
97}
98
99void Shader::sendMatrix(const std::string &name, const glm::mat4 &m) {
100 sendToVar(name, &m[0][0], sizeof(float) * 16);
101}
102
103} // namespace eve::graphics
int y
Definition Grass.cpp:135
int z
Definition Grass.cpp:135
float u
Definition Grass.cpp:234
int x
Definition Grass.cpp:135
int w
Light2D::Data * data
const char * name
Definition RockMesh.cpp:21
int v
float m[16]
bool hasUniform(const std::string &name) const
Definition Shader.cpp:46
void sendVec2(const std::string &name, float x, float y)
Definition Shader.cpp:84
int declareVec2(const std::string &name)
Definition Shader.cpp:31
void sendFloat(const std::string &name, float x)
Definition Shader.cpp:82
void sendMatrix(const std::string &name, const glm::mat4 &m)
Definition Shader.cpp:99
int getFromVar(const std::string &name, void *data, size_t size) const
Definition Shader.cpp:71
void sendVec3(const std::string &name, float x, float y, float z)
Definition Shader.cpp:89
int declareMatrix(const std::string &name)
Definition Shader.cpp:34
int getUniformIndex(const std::string &name) const
Definition Shader.cpp:48
int getUniformFloatCount(const std::string &name) const
Definition Shader.cpp:54
int declareVec3(const std::string &name)
Definition Shader.cpp:32
int declareVec4(const std::string &name)
Definition Shader.cpp:33
static constexpr int kMaxFloats
Definition Shader.h:32
int declareFloat(const std::string &name)
Reserve sequential float slots in the push-constant block. Returns start index.
Definition Shader.cpp:30
void sendVec4(const std::string &name, float x, float y, float z, float w)
Definition Shader.cpp:94
int sendToVar(const std::string &name, const void *data, size_t size)
Low-level blob write into a declared uniform (size must match declaration).
Definition Shader.cpp:60
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition AnimTrail.h:6