nxdk_pgraph_tests
A collection of tests for the Xbox nv2a graphics processor
 
Loading...
Searching...
No Matches
light.h
1#ifndef LIGHT_H
2#define LIGHT_H
3
4#include <cstdint>
5#include <cstring>
6
7#include "xbox_math_vector.h"
8class TestHost;
9
13class Light {
14 public:
15 virtual void Commit(TestHost& host) const;
16
22 virtual void Commit(TestHost& host, const XboxMath::vector_t& look_direction) const;
23
24 [[nodiscard]] uint32_t light_enable_mask() const { return light_enable_mask_; }
25
26 void SetAmbient(const float* ambient) { memcpy(ambient_, ambient, sizeof(ambient_)); }
27
28 void SetAmbient(float r, float g, float b) {
29 ambient_[0] = r;
30 ambient_[1] = g;
31 ambient_[2] = b;
32 }
33
34 void SetDiffuse(const float* diffuse) { memcpy(diffuse_, diffuse, sizeof(diffuse_)); }
35
36 void SetDiffuse(float r, float g, float b) {
37 diffuse_[0] = r;
38 diffuse_[1] = g;
39 diffuse_[2] = b;
40 }
41
42 void SetSpecular(const float* specular) { memcpy(specular_, specular, sizeof(specular_)); }
43
44 void SetSpecular(float r, float g, float b) {
45 specular_[0] = r;
46 specular_[1] = g;
47 specular_[2] = b;
48 }
49
50 void SetBackAmbient(const float* ambient) { memcpy(back_ambient_, ambient, sizeof(back_ambient_)); }
51
52 void SetBackAmbient(float r, float g, float b) {
53 back_ambient_[0] = r;
54 back_ambient_[1] = g;
55 back_ambient_[2] = b;
56 }
57
58 void SetBackDiffuse(const float* diffuse) { memcpy(back_diffuse_, diffuse, sizeof(back_diffuse_)); }
59
60 void SetBackDiffuse(float r, float g, float b) {
61 back_diffuse_[0] = r;
62 back_diffuse_[1] = g;
63 back_diffuse_[2] = b;
64 }
65
66 void SetBackSpecular(const float* specular) { memcpy(back_specular_, specular, sizeof(back_specular_)); }
67
68 void SetBackSpecular(float r, float g, float b) {
69 back_specular_[0] = r;
70 back_specular_[1] = g;
71 back_specular_[2] = b;
72 }
73
74 protected:
78 Light(uint32_t light_index, uint32_t enable_mask);
79
80 virtual ~Light() = default;
81
82 protected:
83 uint32_t light_index_;
84 uint32_t light_enable_mask_;
85
86 float ambient_[3]{0.f, 0.f, 0.f};
87 float diffuse_[3]{1.f, 1.f, 1.f};
88 float specular_[3]{0.f, 0.f, 0.f};
89 float back_ambient_[3]{0.f, 0.f, 0.f};
90 float back_diffuse_[3]{1.f, 1.f, 1.f};
91 float back_specular_[3]{0.f, 0.f, 0.f};
92};
93
97class Spotlight : public Light {
98 public:
99 enum class FalloffFactor {
100 ZERO,
101 ONE_HALF,
102 ONE,
103 TWO,
104 TEN,
105 };
106
107 public:
108 Spotlight() = delete;
109
125 Spotlight(uint32_t light_index, const XboxMath::vector_t& position, const XboxMath::vector_t& direction, float range,
126 float phi, float theta, float attenuation_constant, float attenuation_linear, float attenuation_quadratic,
127 float falloff_1, float falloff_2, float falloff_3);
128
144 Spotlight(uint32_t light_index, const XboxMath::vector_t& position, const XboxMath::vector_t& direction, float range,
145 float phi, float theta, float attenuation_constant, float attenuation_linear, float attenuation_quadratic,
146 FalloffFactor falloff);
147
148 void Commit(TestHost& host) const override;
149
150 private:
151 XboxMath::vector_t position_;
152
153 XboxMath::vector_t direction_;
154
155 float range_;
156
158 float phi_;
159
161 float theta_;
162
164 float attenuation_[3];
165
167 float falloff_[3];
168};
169
173class DirectionalLight : public Light {
174 public:
175 DirectionalLight() = delete;
176
182 DirectionalLight(uint32_t light_index, const XboxMath::vector_t& direction);
183
185 void Commit(TestHost& host) const override;
186
187 void Commit(TestHost& host, const XboxMath::vector_t& look_dir) const override;
188
189 private:
190 XboxMath::vector_t direction_;
191};
192
196class PointLight : public Light {
197 public:
198 PointLight() = delete;
199
211 PointLight(uint32_t light_index, const XboxMath::vector_t& position, float range, float attenuation_constant,
212 float attenuation_linear, float attenuation_quadratic);
213
214 void Commit(TestHost& host) const override;
215
216 private:
217 XboxMath::vector_t position_;
218
219 float range_;
220
222 float attenuation_[3];
223};
224
225#endif // LIGHT_H
Definition light.h:173
void Commit(TestHost &host, const XboxMath::vector_t &look_dir) const override
void Commit(TestHost &host) const override
This must not be called for DirectionalLight instances.
Definition light.cpp:105
Definition light.h:13
Definition light.h:196
Definition light.h:97
Definition test_host.h:47