summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibGL/Lighting.cpp35
-rw-r--r--Userland/Libraries/LibGfx/VectorN.h20
2 files changed, 36 insertions, 19 deletions
diff --git a/Userland/Libraries/LibGL/Lighting.cpp b/Userland/Libraries/LibGL/Lighting.cpp
index 222e28baa5..2e5409d9d0 100644
--- a/Userland/Libraries/LibGL/Lighting.cpp
+++ b/Userland/Libraries/LibGL/Lighting.cpp
@@ -193,26 +193,23 @@ void GLContext::gl_light_model(GLenum pname, GLfloat x, GLfloat y, GLfloat z, GL
void GLContext::gl_light_modelv(GLenum pname, void const* params, GLenum type)
{
- auto invoke_implementation = [&](auto const* params) {
- switch (pname) {
- case GL_LIGHT_MODEL_AMBIENT:
- gl_light_model(pname, params[0], params[1], params[2], params[3]);
- return;
- default:
- gl_light_model(pname, params[0], 0.f, 0.f, 0.f);
- return;
- }
+ VERIFY(type == GL_FLOAT || type == GL_INT);
+
+ auto parameters_to_vector = [&]<typename T>(T const* params) -> FloatVector4 {
+ return (pname == GL_LIGHT_MODEL_AMBIENT)
+ ? Vector4<T> { params[0], params[1], params[2], params[3] }.template to_type<float>()
+ : Vector4<T> { params[0], 0, 0, 0 }.template to_type<float>();
};
- switch (type) {
- case GL_FLOAT:
- invoke_implementation(reinterpret_cast<GLfloat const*>(params));
- break;
- case GL_INT:
- invoke_implementation(reinterpret_cast<GLint const*>(params));
- break;
- default:
- VERIFY_NOT_REACHED();
- }
+
+ auto light_model_parameters = (type == GL_FLOAT)
+ ? parameters_to_vector(reinterpret_cast<GLfloat const*>(params))
+ : parameters_to_vector(reinterpret_cast<GLint const*>(params));
+
+ // Normalize integers to -1..1
+ if (pname == GL_LIGHT_MODEL_AMBIENT && type == GL_INT)
+ light_model_parameters = (light_model_parameters + 2147483648.f) / 2147483647.5f - 1.f;
+
+ gl_light_model(pname, light_model_parameters[0], light_model_parameters[1], light_model_parameters[2], light_model_parameters[3]);
}
void GLContext::gl_lightf(GLenum light, GLenum pname, GLfloat param)
diff --git a/Userland/Libraries/LibGfx/VectorN.h b/Userland/Libraries/LibGfx/VectorN.h
index 7e67a72695..687c0ea7df 100644
--- a/Userland/Libraries/LibGfx/VectorN.h
+++ b/Userland/Libraries/LibGfx/VectorN.h
@@ -159,6 +159,26 @@ public:
}
template<typename U>
+ [[nodiscard]] constexpr VectorN operator+(U f) const
+ {
+ VectorN result;
+ UNROLL_LOOP
+ for (auto i = 0u; i < N; ++i)
+ result.m_data[i] = m_data[i] + f;
+ return result;
+ }
+
+ template<typename U>
+ [[nodiscard]] constexpr VectorN operator-(U f) const
+ {
+ VectorN result;
+ UNROLL_LOOP
+ for (auto i = 0u; i < N; ++i)
+ result.m_data[i] = m_data[i] - f;
+ return result;
+ }
+
+ template<typename U>
[[nodiscard]] constexpr VectorN operator*(U f) const
{
VectorN result;