载入中...
搜索中...
未找到
Light.cpp
浏览该文件的文档.
1#include "graphics/Light.h"
2
3#include <algorithm>
4
5namespace eve::graphics {
6
7Light2D *Light2D::createLight(const std::string &type) {
8 Light2D *l = Light2D::create();
9 ASSERT(l != nullptr);
10 l->data()->entity = l;
11 l->setType(type);
12 return l;
13}
14
15Light2D *Light2D::createEmissiveProxy(float x, float y, float r, float g, float b, float intensity,
16 float radius) {
17 Light2D *l = createLight("point");
18 l->setPosition(x, y);
19 l->setColor(r, g, b, intensity);
20 l->setRadius(radius);
21 l->setVolumetric(true);
23 l->setVolumetricOnly(true);
24 return l;
25}
26
27void Light2D::setType(const std::string &type) {
28 auto d = data();
29 if (type == "dir" || type == "point" || type == "spot")
30 d->type = type;
31 else
32 d->type = "point";
33}
34
35std::string Light2D::getType() { return data()->type; }
36
37void Light2D::setPosition(float x, float y) {
38 data()->x = x;
39 data()->y = y;
40}
41
42float Light2D::getX() { return data()->x; }
43float Light2D::getY() { return data()->y; }
44
45void Light2D::setDirection(float dx, float dy) {
46 data()->dx = dx;
47 data()->dy = dy;
48}
49
50float Light2D::getDirX() { return data()->dx; }
51float Light2D::getDirY() { return data()->dy; }
52
53void Light2D::setColor(float r, float g, float b, float intensity) {
54 auto d = data();
55 d->r = r;
56 d->g = g;
57 d->b = b;
58 d->intensity = intensity;
59}
60
61void Light2D::setRadius(float radius) { data()->radius = radius > 0.f ? radius : 0.f; }
62float Light2D::getRadius() { return data()->radius; }
63
65 data()->spotAngleDeg = std::clamp(degrees, 0.1f, 89.f);
66}
67float Light2D::getSpotAngle() { return data()->spotAngleDeg; }
68
69void Light2D::setSpotSoftness(float softness) {
70 data()->spotSoftness = std::clamp(softness, 0.f, 1.f);
71}
72float Light2D::getSpotSoftness() { return data()->spotSoftness; }
73
74void Light2D::setEnabled(bool enabled) { data()->enabled = enabled; }
75bool Light2D::isEnabled() { return data()->enabled; }
76
77void Light2D::setVolumetric(bool enabled) { data()->volumetric = enabled; }
78bool Light2D::getVolumetric() { return data()->volumetric; }
79
80void Light2D::setVolumetricIntensity(float intensity) {
81 data()->volumetricIntensity = intensity < 0.f ? 0.f : intensity;
82}
83float Light2D::getVolumetricIntensity() { return data()->volumetricIntensity; }
84
85void Light2D::setVolumetricOnly(bool enabled) { data()->volumetricOnly = enabled; }
86bool Light2D::getVolumetricOnly() { return data()->volumetricOnly; }
87
88void Light2D::setCanvas(Canvas *canvas) { data()->canvas = canvas; }
89
90Light3D *Light3D::createLight(const std::string &type) {
91 Light3D *l = Light3D::create();
92 ASSERT(l != nullptr);
93 l->data()->entity = l;
94 l->setType(type);
95 return l;
96}
97
98Light3D *Light3D::createEmissiveProxy(float x, float y, float z, float r, float g, float b,
99 float intensity, float radius) {
100 Light3D *l = createLight("point");
101 l->setPosition(x, y, z);
102 l->setColor(r, g, b, intensity);
103 l->setRadius(radius);
104 l->setVolumetric(true);
106 l->setVolumetricOnly(true);
107 l->setCastShadow(false);
108 return l;
109}
110
111void Light3D::setType(const std::string &type) {
112 auto d = data();
113 if (type == "dir" || type == "point" || type == "spot")
114 d->type = type;
115 else
116 d->type = "point";
117}
118
119std::string Light3D::getType() { return data()->type; }
120
121void Light3D::setPosition(float x, float y, float z) {
122 auto d = data();
123 d->x = x;
124 d->y = y;
125 d->z = z;
126}
127
128float Light3D::getX() { return data()->x; }
129float Light3D::getY() { return data()->y; }
130float Light3D::getZ() { return data()->z; }
131
132void Light3D::setDirection(float dx, float dy, float dz) {
133 auto d = data();
134 d->dx = dx;
135 d->dy = dy;
136 d->dz = dz;
137}
138
139float Light3D::getDirX() { return data()->dx; }
140float Light3D::getDirY() { return data()->dy; }
141float Light3D::getDirZ() { return data()->dz; }
142
143void Light3D::setColor(float r, float g, float b, float intensity) {
144 auto d = data();
145 d->r = r;
146 d->g = g;
147 d->b = b;
148 d->intensity = intensity;
149}
150
151void Light3D::setRadius(float radius) { data()->radius = radius > 0.f ? radius : 0.f; }
152float Light3D::getRadius() { return data()->radius; }
153
155 data()->spotAngleDeg = std::clamp(degrees, 0.1f, 89.f);
156}
157float Light3D::getSpotAngle() { return data()->spotAngleDeg; }
158
159void Light3D::setSpotSoftness(float softness) {
160 data()->spotSoftness = std::clamp(softness, 0.f, 1.f);
161}
162float Light3D::getSpotSoftness() { return data()->spotSoftness; }
163
164void Light3D::setEnabled(bool enabled) { data()->enabled = enabled; }
165bool Light3D::isEnabled() { return data()->enabled; }
166
167void Light3D::setCastShadow(bool cast) { data()->castShadow = cast; }
168bool Light3D::getCastShadow() { return data()->castShadow; }
169
170void Light3D::setShadowMethod(const std::string &method) {
171 // Keep parse logic local so Light.cpp does not depend on ShadowScheme at link for
172 // every translation unit that only needs Light3D; names match parseShadowMethod.
173 auto equals = [](std::string_view a, std::string_view b) {
174 if (a.size() != b.size()) return false;
175 for (size_t i = 0; i < a.size(); ++i) {
176 const char ca = (a[i] >= 'A' && a[i] <= 'Z') ? char(a[i] - 'A' + 'a') : a[i];
177 const char cb = (b[i] >= 'A' && b[i] <= 'Z') ? char(b[i] - 'A' + 'a') : b[i];
178 if (ca != cb) return false;
179 }
180 return true;
181 };
182 std::uint8_t value = data()->shadowMethod;
183 if (equals(method, "auto")) value = 0;
184 else if (equals(method, "none") || equals(method, "off"))
185 value = 1;
186 else if (equals(method, "csm") || equals(method, "cascaded") || equals(method, "directional"))
187 value = 2;
188 else if (equals(method, "perspective") || equals(method, "spot"))
189 value = 3;
190 else if (equals(method, "cube") || equals(method, "cubemap") || equals(method, "point"))
191 value = 4;
192 else
193 return;
194 data()->shadowMethod = value;
195}
196
198 switch (data()->shadowMethod) {
199 case 1:
200 return "none";
201 case 2:
202 return "csm";
203 case 3:
204 return "perspective";
205 case 4:
206 return "cube";
207 default:
208 return "auto";
209 }
210}
211
212void Light3D::setShadowBias(float bias) { data()->shadowBias = bias < 0.f ? 0.f : bias; }
213float Light3D::getShadowBias() { return data()->shadowBias; }
214
216 data()->shadowStrength = strength < 0.f ? 0.f : (strength > 1.f ? 1.f : strength);
217}
218float Light3D::getShadowStrength() { return data()->shadowStrength; }
219
220void Light3D::setVolumetric(bool enabled) { data()->volumetric = enabled; }
221bool Light3D::getVolumetric() { return data()->volumetric; }
222
223void Light3D::setVolumetricIntensity(float intensity) {
224 data()->volumetricIntensity = intensity < 0.f ? 0.f : intensity;
225}
226float Light3D::getVolumetricIntensity() { return data()->volumetricIntensity; }
227
228void Light3D::setVolumetricOnly(bool enabled) { data()->volumetricOnly = enabled; }
229bool Light3D::getVolumetricOnly() { return data()->volumetricOnly; }
230
231} // namespace eve::graphics
double value
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
float degrees
Definition CardTypes.cpp:35
std::uint16_t method
tensor::Graph g
Definition GpuGraph.cpp:7
double r
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
float radius
float d
float dz
float dy
float dx
float bias
Canvas public API.
Definition Canvas.h:17
Declarative 2D light. Collected by RenderSystem (max 8 per canvas/frame). type: "point" | "dir" | "sp...
Definition Light.h:64
float getVolumetricIntensity()
Definition Light.cpp:83
void setDirection(float dx, float dy)
Definition Light.cpp:45
void setPosition(float x, float y)
Definition Light.cpp:37
void setColor(float r, float g, float b, float intensity=1.f)
Definition Light.cpp:53
static Light2D * createEmissiveProxy(float x, float y, float r, float g, float b, float intensity=1.f, float radius=200.f)
Create a volumetric-only glow proxy (skips surface lighting).
Definition Light.cpp:15
float getSpotSoftness()
Current spot softness in [0, 1].
Definition Light.cpp:72
void setVolumetric(bool enabled)
Definition Light.cpp:77
void setCanvas(Canvas *canvas)
Definition Light.cpp:88
void setVolumetricOnly(bool enabled)
Definition Light.cpp:85
void setVolumetricIntensity(float intensity)
Definition Light.cpp:80
float getSpotAngle()
Current outer half-angle in degrees.
Definition Light.cpp:67
void setType(const std::string &type)
Definition Light.cpp:27
void setEnabled(bool enabled)
Definition Light.cpp:74
void setSpotAngle(float degrees)
Outer half-angle of a spot cone in degrees (clamped to (0, 89]).
Definition Light.cpp:64
std::string getType()
Definition Light.cpp:35
static Light2D * createLight(const std::string &type="point")
Definition Light.cpp:7
void setRadius(float radius)
Definition Light.cpp:61
void setSpotSoftness(float softness)
Softness of the spot penumbra in [0, 1].
Definition Light.cpp:69
Declarative 3D light. Collected by RenderSystem3D (max 8 per frame). type: "point" | "dir" | "spot" (...
Definition Light.h:191
void setEnabled(bool enabled)
Definition Light.cpp:164
void setSpotAngle(float degrees)
Outer half-angle of a 3D spot cone in degrees (clamped to (0, 89]).
Definition Light.cpp:154
static Light3D * createEmissiveProxy(float x, float y, float z, float r, float g, float b, float intensity=1.f, float radius=8.f)
Create a volumetric-only point glow proxy for emissive props. Pair with a PBR emissive material + blo...
Definition Light.cpp:98
void setCastShadow(bool cast)
Definition Light.cpp:167
void setDirection(float dx, float dy, float dz)
Definition Light.cpp:132
void setShadowBias(float bias)
Definition Light.cpp:212
float getVolumetricIntensity()
Definition Light.cpp:226
void setVolumetricOnly(bool enabled)
Definition Light.cpp:228
float getShadowStrength()
Definition Light.cpp:218
void setShadowStrength(float strength)
Definition Light.cpp:215
void setPosition(float x, float y, float z)
Definition Light.cpp:121
static Light3D * createLight(const std::string &type="point")
Definition Light.cpp:90
void setType(const std::string &type)
Definition Light.cpp:111
void setVolumetricIntensity(float intensity)
Definition Light.cpp:223
void setShadowMethod(const std::string &method)
Request a shadow technique: auto, none, csm, perspective, cube. Invalid names leave the previous meth...
Definition Light.cpp:170
void setRadius(float radius)
Definition Light.cpp:151
void setColor(float r, float g, float b, float intensity=1.f)
Definition Light.cpp:143
void setSpotSoftness(float softness)
Softness of the spot penumbra in [0, 1].
Definition Light.cpp:159
float getSpotSoftness()
Current spot softness in [0, 1].
Definition Light.cpp:162
std::string getShadowMethod()
Current shadow method name (auto / none / csm / perspective / cube).
Definition Light.cpp:197
void setVolumetric(bool enabled)
Definition Light.cpp:220
float getSpotAngle()
Current spot outer half-angle in degrees.
Definition Light.cpp:157
std::string getType()
Definition Light.cpp:119
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
bool enabled